【问题标题】:OpenGL glEnable(GL_COLOR_MATERIAL) followed by glDisable(GL_COLOR_MATERIAL)OpenGL glEnable(GL_COLOR_MATERIAL) 后跟 glDisable(GL_COLOR_MATERIAL)
【发布时间】:2020-02-02 15:57:08
【问题描述】:

我同时使用glDrawArrays() 在纹理立方体旁边绘制了一个顶点彩色立方体,并发现启用照明后,纹理立方体会“稍微亮一些”。

经过一些调试,我发现在调用glEnable(GL_COLOR_MATERIAL) 的第一刻,即使随后立即调用glDisable(GL_COLOR_MATERIAL),也会在纹理立方体上产生“稍微亮一点”的效果!

这里是简短的描述:

glEnable(GL_COLOR_MATERIAL);
glDisable(GL_COLOR_MATERIAL);
(...)
glDrawArrays(GL_QUADS, 0, n);

如果根本没有调用glEnable(GL_COLOR_MATERIAL),则用黄色绘制立方体。 而如果调用glEnable(GL_COLOR_MATERIAL),即使后面跟着glDisable(GL_COLOR_MATERIAL),立方体也会被画成稍微亮一点的黄色,我也无法切换回“初始深黄色立方体颜色”。

你能告诉我这是否是预期的行为吗?

【问题讨论】:

  • 这确实看起来像一个错误。什么操作系统和什么类型的 GPU(NVidia、ATI)?
  • WinXP SP3 家庭版 ATI Radeon HD4850 OpenGL 版本 6.14.10.11251 最初我认为这是一个错误,但随后使用 PFD_GENERIC_FORMAT 进行了测试并得到了相同的结果。似乎在 glEnable(GL_COLOR_MATERIAL) 之后,OpenGL 状态颜色材料会以“某种”颜色即时更新。

标签: opengl lighting


【解决方案1】:

这并不完全是预期的行为,但应该很容易修复。 GL_COLOR_MATERIAL 允许用顶点颜色覆盖材质属性。错误在于颜色不仅在顶点颜色规范上被重写,而且在颜色材料启用上也被重写(我的猜测是它可能是为了防止错误而故意这样做的)。

要使立方体再次变暗,您需要做的就是使用 glMaterialfv() 恢复默认颜色材质属性(可能是漫反射和环境颜色)。你可以找到default material colors here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2012-07-08
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多