C++ OpenGL Nvidia驱动程序259.12纹理不工作

C++ OpenGL Nvidia驱动程序259.12纹理不工作,c++,c,opengl,textures,C++,C,Opengl,Textures,当我放入NVIDIA Quadro卡时,在ATI卡上运行良好的OpenGL应用程序停止工作。纹理根本不起作用!我已将程序简化为一个无法工作的显示功能: void glutDispCallback() { //ALLOCATE TEXTURE unsigned char * noise = new unsigned char [32 * 32 * 3]; memset(noise, 255, 32*32*3); glEnable(GL_TEXTURE_2D); GLuint textureID;

当我放入NVIDIA Quadro卡时,在ATI卡上运行良好的OpenGL应用程序停止工作。纹理根本不起作用!我已将程序简化为一个无法工作的显示功能:

void glutDispCallback()
{
//ALLOCATE TEXTURE
unsigned char * noise = new unsigned char [32 * 32 * 3];
memset(noise, 255, 32*32*3);

glEnable(GL_TEXTURE_2D);
GLuint textureID;
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, noise);
    delete [] noise;

//DRAW
glDrawBuffer(GL_BACK);
glViewport(0, 0, 1024, 1024);
setOrthographicProjection();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, textureID);
glColor4f(0,0,1,0);
glBegin(GL_QUADS);
    glTexCoord2f(0,0); 
    glVertex2f(-0.4,-0.4);

    glTexCoord2f(0, 1); 
    glVertex2f(-0.4, 0.4);

    glTexCoord2f(1, 1); 
    glVertex2f(0.4, 0.4);

    glTexCoord2f(1,0); 
    glVertex2f(0.4,-0.4);

glEnd();
glutSwapBuffers();

//CLEANUP
GL_ERROR();
glDeleteTextures(1, &textureID);
}
结果是一个蓝色的四边形(或glColor4f()指定的任何东西),而不是纹理所在的白色四边形。我关注了OpenGL网站上的常见问题。我已禁用混合,以防纹理被混合。我禁用了照明。我已经查看了glGetError()-没有错误。我还设置了glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);和GL_贴花。同样的结果。我还尝试了不同的多边形缠绕-顺时针和逆时针


还有其他人遇到过这种情况吗?

您可以尝试在glTexEnvi中使用GL_REPLACE吗?这可能是NV驱动程序中的一个错误。

您的代码是正确的,并且执行了它应该执行的操作

内存集(噪声,255,32*32*3);使纹理为白色,但调用glColor4f(0,0,1,0);因此最终颜色将是(1,1,1)*(0,0,1)=(0,0,1)=蓝色


你想要什么样的行为

我发现了错误。在我的代码的其他地方,我初始化了一个GL_TEXTURE_3D对象,并没有调用glDisable(GL_TEXTURE_3D)

尽管我调用了glBindTexture(GL_TEXTURE_2D,textureID);它应该将2D纹理绑定为当前纹理,并使用该纹理-因为此代码始终适用于ATI卡。显然,英伟达的司机没有这么做——因为某种原因,是使用3D纹理。因此添加glDisable(GL_TEXTURE_3D);修复了问题,一切正常


谢谢所有想帮忙的人。

我已经试过了。刚刚修改了我的帖子。我还尝试了GL_调制。鉴于GL_纹理_环境_模式设置为GL_替换,并且禁用了GL_混合,我希望蓝色会被忽略,而纹理颜色会在其位置使用。我也不明白为什么你的颜色乘法运算是正确的。OpenGL是在什么模式下完成的?这不是我知道的任何混合。是的,这是问题,用GLASRead这个片段颜色应该是纹理颜色直接。对于它来说,英伟达驱动程序做正确的事情。如果启用了多个目标(此处为3d和2d),则规则是3d优先于2d。立方体>三维>二维>一维。详细信息请参见每帧创建/销毁纹理对象的原因,而不仅仅是上载新的纹理数据?这只是一些复制问题的代码。我在现实中没有这样做。