nVidia openGL无法显示简单的颜色索引纹理

nVidia openGL无法显示简单的颜色索引纹理,opengl,nvidia,texture-mapping,Opengl,Nvidia,Texture Mapping,我有我的第一个简单的OpenGL程序,使用OpenGL显示2D图像。我正在使用一个基于索引的图像,调用glTexImage2D(…GL\u RGB,…GL\u COLOR\u image…) 这在ATI卡上正常工作。 换成nVidia卡后,我看到的是一个黑色的方块,而不是我的图像。考虑到它在ATI上工作,我想代码基本上是正确的-但可能我错过了一个设置-或者可能卡不支持我正在做的事情(?) 首先是设置代码(顺便说一句,我正在使用Qt,所以可能缺少一些上下文调用):- 下面是设置纹理的代码:- GL

我有我的第一个简单的OpenGL程序,使用OpenGL显示2D图像。我正在使用一个基于索引的图像,调用
glTexImage2D(…GL\u RGB,…GL\u COLOR\u image…)
这在ATI卡上正常工作。 换成nVidia卡后,我看到的是一个黑色的方块,而不是我的图像。考虑到它在ATI上工作,我想代码基本上是正确的-但可能我错过了一个设置-或者可能卡不支持我正在做的事情(?)

首先是设置代码(顺便说一句,我正在使用Qt,所以可能缺少一些上下文调用):-

下面是设置纹理的代码:-

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() );
我还使用对glTexImage2D的直接RGB-RGB调用,在单独的窗口中以全彩显示相同的图像。所以我相信尺寸是可以接受的

如果我删除对glTexImage2D的调用,那么我会得到一个黄色的四元组。因此,我怀疑我在设置颜色LUT时遇到了问题

该董事会是华硕GeForce 210静默董事会 WindowsXP32位。
nVidia驱动程序6.14.13.681(9-23-2012),R306.81(分支:r304_70-122)

您是否测试了OpenGL错误代码?您可以使用以下代码:–关于颜色索引格式?如果没有司机的支持,我也不会感到惊讶。现在没有人使用颜色索引格式。如果要绘制托盘纹理,请将托盘上载到1D RGB纹理中,将颜色索引图像上载到单个通道(GL_红色或GL_亮度,取决于OpenGL版本)2D纹理中,并将该值用作托盘纹理的索引。

感谢DatenWalf。我确实检查了错误——为了清晰起见,我在上面去掉了错误(我用gluErrorString为我翻译)。但他们都返回了零。是的!答案是使用glpixeltranferi(GL_MAP_COLOR,TRUE);glPixelMapfv(GL_PIXEL_MAP_I_TO_R,256,灰色);:我以为我已经试过了,但我想我没有正确地试过
glEnable(GL\u MAP\u COLOR)
或其他东西,这确实给了我一个错误。多亏了datenwolf,我再次尝试重现错误,但这次我更加小心了。当然,这个代码是正确的,英伟达卡的行为是逻辑的,而ATI板的行为可能不规范,但显示出“不可定义”的行为。
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);