OpenGL:加载纹理会改变当前颜色

Posted

技术标签:

【中文标题】OpenGL:加载纹理会改变当前颜色【英文标题】:OpenGL: Loading a texture changes the current color 【发布时间】:2010-08-04 13:16:43 【问题描述】:

我注意到当我加载纹理时,它可能会改变当前的绘制颜色,具体取决于纹理的颜色。比如执行后

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, info.biWidth,
    info.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,bitmap);
glTexParameterf(GL_TEXTURE_2D,
    GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,
    GL_TEXTURE_MAG_FILTER, GL_LINEAR);

绘制到屏幕上的所有连续多边形都将根据加载的纹理图像具有颜色。

这是标准吗?我没有发现这种行为记录在案。

【问题讨论】:

【参考方案1】:

是的,它是这样工作的,记住 GL 是一个状态机,所以你离开了纹理绑定(并且可能启用),所以在绘制它时使用第一个像素(假设你没有提供任何纹理坐标)为基元着色。

要解决它,当你不想要纹理时禁用纹理,你可以这样做:

glDisable(GL_TEXTURE_2D);

【讨论】:

嗯?只使用glColor4f(1.0f,1.0f,1.0f,1.0f),而不是禁用整个纹理功能不是更好吗? @Matias,谢谢,但我很高兴在 OpenGL 标准的某个地方看到这一点。 @Elazar 不,使用 glColor 会将纹理颜色乘以 1.0。这没有直接记录,您会找到的唯一文档是“GL 是状态机”,如果启用了纹理,则绑定一个纹理,您如何期望 GL 知道您不需要纹理? 另一种方法就是绑定默认纹理:glBindTexture(GL_TEXTURE_2D, 0); 更准确地说,问题的产生是因为当你加载一个纹理时,你将加载的纹理绑定到GL_TEXTURE_2D,如果启用了纹理,GL会使用它。

以上是关于OpenGL:加载纹理会改变当前颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用 CUDA-OpenGL 互操作时,NPOT 纹理会导致渲染效果不佳

在 iOS 上的 OpenGL ES 着色器中混合多个纹理会导致反向行为

初识OpenGL (-)多级渐远纹理(Mipmap)

初识OpenGL (-)多级渐远纹理(Mipmap)

初识OpenGL (-)多级渐远纹理(Mipmap)

OpenGL之Mipmap、压缩纹理