我有我的第一个简单的 OpenGL 程序来使用 OpenGL 显示 2D 图像。我正在使用基于索引的图像,调用glTexImage2D(.. GL_RGB, ... GL_COLOR_IMAGE...)
这在 ATI 卡上按预期工作。换成 nVidia 卡后,我看到一个黑色四边形而不是我的图像。鉴于它适用于 ATI,我猜代码基本上是正确的 - 但也许我错过了一个设置 - 或者卡不支持我正在做的事情(?!)
首先是安装代码(我使用的是 Qt btw,所以可能缺少一些上下文调用):-
glClearColor( 0.1, 0.1, 0.25, 0); // background color
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
这是设置纹理的代码:-
GLfloat Greys[256];
GLfloat Ones[256];
for( int I(0); I < 256; ++I )
{
Greys[I] = (GLfloat)I/256;
Ones[I] = 1.0;
}
makeCurrent();
glPixelMapfv( GL_PIXEL_MAP_I_TO_R, 256, Greys );
glPixelMapfv( GL_PIXEL_MAP_I_TO_G, 256, Greys );
glPixelMapfv( GL_PIXEL_MAP_I_TO_A, 256, Ones );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_pImage->size().width(), m_pImage->size().height(), 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, m_pImage->bits() );
这是显示代码
glLoadIdentity();
// Get the camera in the right place
glRotatef( 180, 1, 0, 0 );
// Apply the Pan(Offset), and Zoom
glTranslatef( m_Offset.x(), m_Offset.y(), 0);
glScalef( m_Zoom, m_Zoom, 1 );
// Display the image texture mapped to a rectangle
glColor3f( 1,1,0 );
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f( 0, 0 ); glVertex3f( 0, 0, 10 );
glTexCoord2f( 1, 0 ); glVertex3f( ImSize.width(), 0, 10 );
glTexCoord2f( 1, 1 ); glVertex3f( ImSize.width(), ImSize.height(), 10 );
glTexCoord2f( 0, 1 ); glVertex3f( 0, ImSize.height(), 10 );
glEnd();
glDisable(GL_TEXTURE_2D);
我还使用对 glTexImage2D 的直接 RGB - RGB 调用在单独的窗口中以全彩显示相同的图像。所以我相信尺寸是可以接受的。
如果我删除对 glTexImage2D 的调用,那么我会按预期得到一个黄色四边形。因此,我怀疑设置颜色 LUT 的调用有问题。
主板是华硕 GeForce 210 静音 Windows XP 32 位。nVidia 驱动程序 6.14.13.681 (9-23-2012),R306.81(分支:r304_70-122)