我在使用opengl渲染纹理时遇到了一些问题。首先我渲染我的纹理,然后渲染一个正方形。为了设置我的正方形的颜色,我使用了glColor3f(1.0f,0.0f,0.0f);,这会使正方形变成红色。但是当我的纹理再次被渲染时,它也会被渲染成红色。
这里的问题是什么?
发布于 2013-05-06 02:39:11
当您调用glColor时,将为所有将来的绘制调用设置常量颜色。如果你想让它回到你开始时的样子,你必须在绘制你的正方形之后显式地将它设置回去。
通常(取决于纹理环境),顶点颜色和恒定颜色在顶点着色期间组合,然后进行插值,然后与片段着色中的纹理颜色相乘。
如果使用glColor3f(1,0,0),则最终会将纹理的红色通道乘以1.0,将绿色和蓝色通道乘以0.0,因此只能获得纹理的红色通道。
您需要将常量颜色重置为1,1,1才能看到常规纹理颜色。
一般来说,你会想要提前设置所有的通用gl状态,然后在绘制任何需要特殊更改的东西后“返回”到那个状态。这有时被称为“零状态”。您还会注意到,许多性能调优文献建议将具有类似不常见的非零状态需求的东西批处理在一起--这可能会也可能不会产生影响,具体取决于图形驱动程序、硬件等。
发布于 2013-05-06 02:36:59
这里的“问题”是(a)默认情况下,opengl使用GL_MODULATE texenv模式,因此片段的颜色乘以纹理的颜色来生成最终颜色,并且(b) openGL是一个状态机,所以只要您设置其他颜色,红色就会一直存在。
请注意,在使用照明时,GL_MODULATE对于将照明计算结果与纹理颜色相结合非常有用。
如果您只想要纹理,您可以在绘制纹理对象之前指定白色,我们使用另一种纹理环境模式,如GL_REPLACE:
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);请查看manpage of glTexEnv以了解该功能以及可用模式和选项的说明。
https://stackoverflow.com/questions/16387694
复制相似问题