对于OpenGL中光照和颜色混合的理解

来源:互联网 发布:相册源码 无数据库 编辑:程序博客网 时间:2024/06/11 14:03

摘自《OpenGL游戏程序设计》

 

光照

      //光照变量

      float ambientLight[] = {0.3f,0.5f,0.8f,1.0f} ;    //环境光

      float diffuseLight[] = {0.25f,0.25f,0.25f,1.0f) ;    //散射光

      这些变量定义了光的属性。ambientLight变量声明了其环境光属性,红色分量0.3,绿色分量为0.5和蓝色分量为0.8。这就意味着照射着所有物体的全局光具有偏向蓝色的色调。而diffuseLight变量将红色、绿色和蓝色分量的值都设为0.25,其效果就是立方体被散射光直接照射的表面比其没被照射的表面要亮得多。

 

      //材质变量

      float matAmbient[] = {1.0f,1.0f,1.0f,1.0f} ;     

      float matDiff[] = {1.0f,1.0f,1.0f,1.0f} ;    

      第一个变量matAmbient定义了材质表面对于光线中的环境光分量是如何反应的。此例中,变量中的每一个值都为1.0,意味市场环境光的红色、绿色和蓝色分量全部都会被此表面所反射。同理,在此例中,散射光的红色、绿色和蓝色分量也都会被表面全部反射。

 

颜色混合

     OpenGL中的颜色混合可以为场景带来像透明这样的视觉效果。利用透明,我们可以模拟水、窗户、玻璃以及这个世界上其他的我们可以看穿的物体。

     当绘制场景时,若想在OpenGL中正确地进行混合,就要涉及到深度缓存的打开和关闭。为此,我们先在深度缓存的正常状态下绘制所有不透明的物体;然后调用glDepthMask()函数将深度缓存设为只读状态,这样就将绘制不透明物体时的深度值保护了起来。在深度缓存为只读状态时,对透明物体的绘制不会影响到已经绘制好的不透明物体,因为深度缓存不能被改变。但是要记住透明物体仍然会进行深度检测,与深度缓存中的值相比较,如果位于不透明物体的后面,它们也不会被绘制。如果位于不透明物体的前面,透明物体将与不透明物体混合。使用glDepthMask()函数时,如果要设置为只读状态,就向其传递GL_FALSE参数值,而如果想设置为正常状态,则要传递GL_TRUE参数值。