以前も質問させて頂いたのですが、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;
}