0

我有我的第一个简单的 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)

4

1 回答 1

0

您是否测试过 OpenGL 错误代码?您可以使用以下代码:https ://gist.github.com/4144988 - 关于颜色索引格式?如果驱动程序根本不支持它,我不会感到惊讶。这些天没有人使用颜色索引格式。如果要绘制调色板纹理,请将调色板上传到 1D RGB 纹理,并将颜色索引图像上传到单个通道(GL_RED 或 GL_LUMINANCE,取决于 OpenGL 版本)2D 纹理,并将该值用作调色板纹理的索引。

于 2012-12-02T20:30:00.837 回答