这一课的基础是第六课、第七课,要先画一个正方体出来,实现它的旋转、光照等控制。在这里对雾的设置全在InitGL() 函数中。
首先是载入材质、清空深度缓存,打开深度测试,等等。接下来就是雾的设置函数。
glFogi(GL_FOG_MODE, fogMode[fogfilter]); //设置雾气的模式
glFogfv(GL_FOG_COLOR, fogColor); // 设置雾的颜色
glFogf(GL_FOG_DENSITY, 0.35f); // 设置雾的密度
glHint(GL_FOG_HINT, GL_DONT_CARE); // 设置系统如何计算雾气
glFogf(GL_FOG_START, 1.0f); // 雾气的开始位置
glFogf(GL_FOG_END, 5.0f); // 雾气的结束位置
glEnable(GL_FOG); // 使用雾气
能看出来,这里的几个函数都十分相似,它们都是glFog函数。glFogf, glFogi, glFogfv, glFogiv的不同在于后面的参数不同。
先看函数的说明。
void glFogf(GLenum pname,GLfloat param)
void glFogi(GLenum pname,GLint param)
其中,pname是指定的一个单值雾参数。可以是GL_FOG_MODE、GL_FOG_DENSITY GL_FOG_START、GL_FOG_END GL_FOG_INDEX。
void glFogfv(GLenum pname,const GLfloat *params)
void glFogiv(GLenum pname,const GLint *params)
pname可以是GL_FOG_MODE、GL_FOG_DENSITY、 GL_FOG_START、GL_FOG_END、 GL_FOG_INDEX、GL_FOG_COLOR。
注意,这四个函数差别很细微,前两个的功能后两个都有,但后两个比前两个多了颜色控制的功能,而后两个的数值参数是const型(复习const,可以看: http://blog.youkuaiyun.com/Eric_Jo/article/details/4138548 )。而第一个和第三个的数字量是GLfloat,第二个和第四个是GLint。
接下来看这几个参数和取值范围。
GL_FOG_MODE
参数是一个整数或浮点值,指定要使用的方程来计算雾混合因素,f。可以是三个符号常量:GL_LINEAR GL_EXP,GL_EXP2。相应的有不同的计算方程。默认GL_EXP雾模式。
GL_FOG_DENSITY
参数是指定一个整数或浮点值密度,用于指数雾雾密度方程。只接受非负密度。默认的灰雾密度是1.0。
GL_FOG_START
参数是指定一个整数或浮点值开始,近距离用于线性雾方程。默认的距离是0.0。
GL_FOG_END
参数是指定一个整数或浮点值,远距离用于线性雾方程。默认的距离是1.0。
GL_FOG_INDEX
参数是指定一个整数或浮点值,作为雾色指数。默认的雾指数为0.0。
GL_FOG_COLOR
参数包含四个整数或浮点值,指定Cf,雾的颜色。整数值线性映射,这样是最积极的可表示的值映射到1.0,最消极的可表示的值映射到-1.0。浮点值直接映射。转换后,所有颜色组件夹区间[0,1]。默认的是雾颜色(0,0,0,0)。
glFog()函数之后是glHint()函数。这个函数是用于修正的。
参数如下:
GL_FOG_HINT
指示雾计算的准确性。 如果 OpenGL 实现不有效地支持每像素雾计算,提示 GL_DONT_CARE 或 GL_FASTEST 会导致每个顶点雾化效果计算。
GL_LINE_SMOOTH_HINT
指示是锯消除行的采样质量。如果应用了一个较大的筛选器函数,则将提示 GL_NICEST 可能会导致生成过程中栅格化,更多像素碎片。
GL_PERSPECTIVE_CORRECTION_HINT
表示颜色和纹理坐标插补的质量。 如果角度更正参数插值不有效地支持由 OpenGL 实现,提示 GL_DONT_CARE 或 GL_FASTEST 可以导致简单线性插值的颜色和/或纹理坐标。
GL_POINT_SMOOTH_HINT
表示是锯消除点采样的质量。 如果应用了一个较大的筛选器函数, 则将提示 GL_NICEST 可能会导致生成 过程中栅格化,更多像素碎片。
GL_POLYGON_SMOOTH_HINT
指示是锯消除多边形的采样质量 。如果应用了一个较大的筛选器函数,则将提示GL_NICEST 可能会导致生 成过程中栅格化, 更多像素碎片。
取值如下:
GL_FASTEST
应选择最有效的选项。
GL_NICEST
应选择最正确或最高质量的选项。
GL_DONT_CARE
客户端没有一个首选项。
Nehe的解释是这样的:“glHint (GL_FOG_HINT, GL_DONT_CARE); 设置修正。我使用了GL_DONT_CARE因为我不关心它的值。gl_dont_care - 由OpenGL决定使用何种雾效(对每个顶点还是每个像素执行雾效计算)和一个未知的公式(?)gl_nicest - 对每个像素执行雾效计算(效果好)。gl_fastest - 对每个顶点执行雾效计算 (更快,但效果不如上面的好)
雾的设置就这样完成了。