【问题标题】:nVidia openGL fails to display simple COLOR_INDEX texturenVidia openGL 无法显示简单的 COLOR_INDEX 纹理
【发布时间】:2012-12-02 19:52:17
【问题描述】:

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

【问题讨论】:

    标签: opengl nvidia texture-mapping


    【解决方案1】:

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

    【讨论】:

    • 感谢 datenwolf。我确实检查了错误 - 为了清楚起见,我把它们去掉了(我使用 gluErrorString 为我翻译)。但无论如何,它们都返回零。
    • 是的!答案是使用 glPixelTransferi( GL_MAP_COLOR, TRUE ); glPixelMapfv(GL_PIXEL_MAP_I_TO_R,256,灰色); :我以为我已经尝试过了 - 但我认为我错误地尝试了glEnable(GL_MAP_COLOR) 或其他东西 - 确实给了我一个错误。感谢 datenwolf,我再次尝试重现错误,但这次我设法做得更仔细。当然,这段代码是正确的,并且 nVidia 卡的行为符合逻辑,而 ATI 板的行为可能不符合规范,但显示出体面的“未定义”行为。
    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多