ページ 11

OpenGLを使用した10bit表示

Posted: 2013年1月18日(金) 16:05
by yoshihingis
 お世話になります。
 以前も質問させて頂いたのですが、10bit表示をさせる方法で、OpenGLのライブラリGLUTを使用すれば可能であることがNvidiaの資料に記述が有りました。
 http://www.nvidia.com/docs/IO/40049/TB- ... 02_new.pdf
 の13ページに10bit出力の描画Windowの設定方法が記述されています。

 Nvidiaのグラフィックカードドライバーで10bit出力させると、コマンドプロンプト画面にRGB size 10:10:10と表示されます。通常はRGB size 8:8:8

Pixelデータの表示方法は、http://wisdom.sakura.ne.jp/system/openg ... htmlに記述があり
 void glDrawPixels(
GLsizei width , GLsizei height ,
GLenum format , GLenum type , const GLvoid *pixels
);

 表示可能ということが分かりました。
 そこで、RGB3CH 8bitのRawデータを読み込んで表示するコードを作成し、これは問題なく動作したのですが、それを改造して作成した10bit表示用コードがうまく動作しません。
 
 どなたかOpenGL GLUTに詳しい方、コードのどこに問題があるかご指摘頂けないでしょうか。

[ハード環境]
グラフィックカード Nvidia Quadro2000 10bit出力対応
 モニタ       ナナオ EIZO C320 10bit対応
 ディスプレイポートで接続し、MiceosoftのDirectXを使用した10bit出力のサンプルコードで10bit出力されることは確認済み。

[行いたい事]
RGB 16bitX3の上位(または下位)10bitに配置した画像データ(Raw形式)を読み込ませ、GLUTを使って、ディスプレイに表示したい。
10Bit1024_1024U.raw は、16bitの上位10bitに画像を配置したRGBの1024X1024pixelの画像データです。
16bitの下位10bitにデータを配置して、実験もしましたが、描画ウィンドウは、全白で何も表示されません。

どなたかお助け頂ければ幸いです。 

コード:

//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <Windows.h>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int redSize,greenSize, blueSize;

int i;
int CH = 3;

int inwidth = 1024;
int inheight = 1024;

float color = 0.0;
float y;

FILE *fp1;

	
//出力画像データエリア
unsigned short *inimg0;

void display(void)
{

//READ DATAの表示
glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(-1 , -1);
glDrawPixels(inwidth , inheight , GL_RGB , GL_UNSIGNED_SHORT  , inimg0);
glFlush();

}



int main(int argc, char *argv[])
{


//画像データメモリ領域確保

	inimg0 =(unsigned short*)malloc(sizeof(unsigned short)*inwidth*inheight*CH);
	
//Data FILE READ
 fp1 = fopen("10Bit1024_1024U.raw","rb");
  if(fp1==NULL){
		 printf("Output file Error!!\n");
		 getchar();
		 return;
	 }
  
	 fread(inimg0,sizeof(unsigned short),inwidth*inheight*CH,fp1);
	 
	 fclose(fp1);



//window Positionと大きさの設定	
  glutInitWindowPosition(0, 0);
  glutInitWindowSize(inwidth, inheight);
	
	glutInit(&argc, argv);

  //処理をココに入れる

  glutInitDisplayString("red=10 green=10 blue=10 alpha=2");

  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
 

  glutCreateWindow("30-bit DEMO");

//int redSize,greenSize, blueSize;

  glGetIntegerv(GL_RED_BITS,& redSize);
  glGetIntegerv(GL_GREEN_BITS,& greenSize);
  glGetIntegerv(GL_BLUE_BITS,& blueSize);

  printf("RGB size %d:%d:%d\n",redSize,greenSize,blueSize);
  
  //処理をココにいれる。

  
  glutDisplayFunc(display);

  
  glutMainLoop();

  free(inimg0);
  
  return 0;
}

Re: OpenGLを使用した10bit表示

Posted: 2013年1月18日(金) 17:51
by ISLe
件のNVIDIAの資料には、OpenGLでは浮動小数点数(flaot)またはパックトピクセル(RGB10_A2)形式のテクスチャが30ビットレンダリングに対応している、という記述がありますけど。
glDrawPixelsでは描画できないのでは?

テクスチャを作成するコードもNVIDIAの資料の中にあるのでそのまま使ったら良いのではないでしょうか。

Re: OpenGLを使用した10bit表示

Posted: 2013年1月21日(月) 11:23
by yoshihingis
ISLe様、ご返信ありがとうございます。

 なるほどglDrawPixels()では10bit表示できない可能性があるわけですね。
 10bitの画像データを読み込んで、モニター上に10bit階調の画像を表示させる画像ビューアーのようなものを作るのが目的なので、テクスチャ作成だけではうまくできなような気がするのですが。
 なにぶん、初心者なので、思い違い等あると思いますので、いろいろまtご指摘やアイデアをご教授頂ければ幸いです。

Re: OpenGLを使用した10bit表示

Posted: 2013年1月21日(月) 11:59
by yoshihingis
 自己解決ですが、表示をダブルバッファにして、背面データにデータを書き込んでいたようです。

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
→glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE| GLUT_DEPTH);

と変更したところ、描画ウィンドウに、Rawデータの画像が出力されました。
ただし10bit階調で出ているかの確認が、画像の作り方がまずく、確認できておりません。

 10bit階調出力が確認できましたら、またご連絡いたします。

Re: OpenGLを使用した10bit表示

Posted: 2013年1月21日(月) 14:39
by yoshihingis
10bit表示がされていること確認できました。
 グラフィックドライバーで、8/10bit設定を切り替えて1024階調のランプ画像が10bit時階調がなめらかになること確認しました。

 ダブルバッファの場合は、最後にglFlushでなく、glutSwapBuffers();を入れれば、問題なく表示されることも分かりました。