【问题标题】:OpenGL Nvidia Driver 259.12 texture not workingOpenGL Nvidia 驱动程序 259.12 纹理不起作用
【发布时间】:2010-08-10 01:55:16
【问题描述】:

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

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_DECAL。结果相同。我也尝试过不同的多边形绕组 - CW 和 CCW。

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

【问题讨论】:

  • 你有什么理由每帧都创建/销毁一个纹理对象,而不是仅仅上传新的纹理数据?
  • 这只是一些复制问题的代码。在现实中我不会这样做。

标签: c++ c opengl textures


【解决方案1】:

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

【讨论】:

  • 我试过了。刚刚修改了我的帖子。我也试过 GL_MODULATE。
【解决方案2】:

你的代码是正确的,并且做了它应该做的。

memset(噪声, 255, 32*32*3);使纹理变白,但您调用 glColor4f(0,0,1,0);所以最终的颜色将是 (1,1,1)*(0,0,1) = (0,0,1) = blue。

你想要的行为是什么?

【讨论】:

  • 鉴于 GL_TEXTURE_ENV_MODE 设置为 GL_REPLACE,并且 GL_BLEND 被禁用,我希望蓝色被忽略,纹理颜色将被使用。另外我不明白为什么你的颜色乘法操作是正确的。 OpenGL在什么模式下做到这一点?这不是我所知道的任何混合。
  • 是的,这就是问题所在,使用 GL_REPLACE 片段颜色应该直接是纹理颜色。
【解决方案3】:

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

即使我调用了 glBindTexture(GL_TEXTURE_2D, textureID);它应该将 2D 纹理绑定为当前纹理并使用它 - 因为此代码始终适用于 ATI 卡。显然,nVidia 驱动程序并没有这样做——它出于某种原因使用了 3D 纹理。所以添加 glDisable(GL_TEXTURE_3D);解决了问题,一切都按预期工作。

感谢所有试图提供帮助的人。

【讨论】:

  • 对于它的价值,nvidia 驱动程序做了正确的事情。如果您启用了多个目标(此处为 3d 和 2d),则规则是 3d 优先于 2d。立方体 > 3D > 2D > 1D。详情请参阅stackoverflow.com/questions/2784937/…
猜你喜欢
  • 2020-03-05
  • 2019-08-30
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2013-04-21
  • 2017-11-26
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多