本文主要对OpenGL中雾的计算原理进行介绍,在参考【1】的第6章、 NEHE教程的第16章和第41章都有示例代码。
一. 雾的计算原理
把片断(fragment)颜色和雾颜色以一定比例混合,就能产生雾的效果。比例因子f,主要有三种计算混合因子的方法,如下面的三个等式所示,其中c指的是眼睛坐标与片段中心之间的距离或者是雾坐标,通过等式计算出个的因子f,需要缩放至[0,1]范围内。
雾浓度的计算等式
在RGBA模式和颜色索引模式下,都能支持雾的计算,具体可以参考【1】。
二. OpenGL雾相关的API函数
void glFog{f,i}(GLenum pname, TYPE param); void glFog{f,i}v(GLenum pname, const TYPE * params); void glFogCoord{d,f}(TYPE coord); void glFogCoord{d,f}v(TYPE * coord);void glFogCoordPointer(GLenum type, GLsizei stride, GLvoid * pointer);
void glFog{f,i}(GLenum pname, TYPE param);
void glFog{f,i}v(GLenum pname, const TYPE * params);
GL_FOG_COORD_SRC 参数在Opengl 1.4及其后版本中才会支持,即雾坐标在Opengl 1.4及其后版本中才会支持。
void glFogCoord{d,f}(TYPE coord);void glFogCoord{d,f}v(TYPE * coord);
规定了顶点或者当前光栅位置的雾坐标,顶点之间的雾坐标值通过插值计算得出。
void glFogCoordPointer(GLenum type, GLsizei stride, GLvoid * pointer);
雾坐标数组,与顶点数组类似的。
三. 参考
【1】《OpenGL programming guide, the official guide to learning OpenGL, Version 2.1, sixth edition》