我的场景照明效果很好。我想添加一个会逐渐消失的天空盒,所以我正在使用
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
连同glColor4f一起执行此操作,效果很好。但是要使淡入淡出正常工作,我需要启用GL_COLOR_MATERIAL,这将完全消除我的照明效果。我尝试将天空盒部分夹在中间
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
(..light details..)
glEnable(GL_COLOR_MATERIAL);
(drawSkyBox)|
glDisable(GL_COLOR_MATERIAL);
(draw rest of scene)
但这仅能使淡入淡出起作用,而仍然不显示我的照明。奇怪的是
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
(..light details..)
glEnable(GL_COLOR_MATERIAL);
glDisable(GL_COLOR_MATERIAL);
(drawSkyBox)
(draw rest of scene)
我失去了淡入淡出和灯光效果。我是否正确使用GL_COLOR_MATERIAL?如果我立即启用和禁用,应该没有影响,让我的灯光保持完整吗?
最佳答案
天空盒可能不应该受到光照的影响。没有什么比在天空和云彩上闪闪发亮的镜面反射更使它看起来很奇怪了。因此在渲染时禁用照明是有意义的。如果关闭照明,则顶点将采用您为其指定的任何颜色(使用glColor)。
如果打开照明,则顶点将采用照明的颜色和材质属性的组合。您可以为每个顶点分别设置环境,漫反射和镜面滤色器,然后将它们与光源中的关联颜色以及其他一些数学运算相乘,以考虑方向和衰减。如果您通常只更改环境颜色和漫反射颜色,并且希望它们是相同的,因为您已经将光源的环境属性和漫反射属性都设置为白色,而环境显着变暗而不是漫反射,则可以启用COLOR_MATERIAL,然后设置glColor()与使用GL_AMBIENT_AND_DIFFUSE调用glMaterial相同。