所谓雾效果,就是使远处的物体看上去逐渐变得模糊。雾在本质上是一种视觉模拟应用,用于模拟有线可视性的场合。
当雾启用后,远离观察点的物体开始融入到雾颜色中。可以控制雾的浓度,它决定了物体随着距离的增加而融入到雾颜色的速度,另外还可以设置雾的颜色。下面先看一张雾的效果图:
在大型的模拟程序中,雾可以提高性能,因为它可以选择不绘制那些因为雾的影响而不可见的物体。下面我们来看一下雾的使用:
glEnable(GL_FOG); { GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1.0}; fogMode = GL_EXP; glFogi (GL_FOG_MODE, fogMode); glFogfv (GL_FOG_COLOR, fogColor); glFogf (GL_FOG_DENSITY, 0.35); glHint (GL_FOG_HINT, GL_DONT_CARE); glFogf (GL_FOG_START, 1.0); glFogf (GL_FOG_END, 5.0); }
首先是启用雾效果,然后用glFog*()来控制雾浓度的方程式:
1、设置雾的模式GL_FOG_MODE,有GL_Liner、GL_EXP、GL_EXP2...雾的模式决定了雾混合因子。
2、设置雾的颜色GL_FOG_COLOR。
3、设置雾的密度GL_FOG_DENSITY。
4、GL_FOG_HINT确定了雾的渲染方式,使用GL_DONT_CARE是因为并不关心建议值。GL_NICEST对每一像素进行雾的渲染,它看起来是极棒的。GL_FASTEST每一顶点进行雾的渲染,它速度较快,但是不够美丽
5、设置雾的范围,即摄像机的位置与片段中心的视觉坐标距离小于GL_FOG_START,即可见,大于GL_FOG_END则不可见,在两者范围之间则受雾浓度方程式的影响
当你看完上述五个条件后,也许你还对雾的设置不是太明白,但是不用担心,当你了解了雾浓度方程式后,你就明白了上述几项都是该方程式的参数。下面来介绍雾的浓度方程式。
RGBA模式下的,雾最终颜色方程式为:。
其中表示源片段的颜色索引,表示用GL_FOG_COLOR分配的雾颜色值,f则为雾混合因子:
根据GL_FOG_MODE设置的模式,选择对应的混合因子套入,即可得到片段在雾效果下的颜色。