第16课 |
|
这篇教程由Chris Aliotta编写。
你想给你的OpenGL程序添加雾效?我将在这篇教程中教你如何去做。这是我第一次写教程,我也只是OpenGL/C++编程的新手,所以如果你发现了什么错误请告诉我而不是叱责我。本课的代码基于第七课的代码编写。 Data Setup: 我们将从设置保存雾的信息的变量开始。变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2和GL_LINEAR。我将在稍后解释这三种类型的区别。这些变量位于程序开头GLuint
texture[3]这行后。变量fogfilter将用来表示我们使用的是哪种雾类型。变量fogColor保存雾的颜色。在程序的顶部我还加了一个布尔类型的变量gp用来记录'g'键是否被按下。 |
bool gp; // G健是否按下 GLuint filter; // 使用哪一个纹理过滤器 GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // 雾气的模式 GLuint fogfilter= 0; // 使用哪一种雾气 GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; // 雾的颜色设为白色
现在我们已经设置了变量,接下来我们来看InitGL函数。为了获得更好的效果,glClearColor()这行已经被修改为将屏幕清为同雾相同的颜色。使用雾效只需很少的代码。总之你将发现这很容易。 |
glClearColor(0.5f,0.5f,0.5f,1.0f); // 设置背景的颜色为雾气的颜色 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); // 使用雾气
让我们先看看这段代码的头三行。第一行glEnable(GL_FOG);(?这应该是最后一行)不用再解释了吧,主要是初始化雾效。 第二行glFogi(GL_FOG_MODE, fogMode[fogfilter]);建立雾的过滤模式。之前我们声明了数组fogMode,它保存了值GL_EXP,
GL_EXP2, and GL_LINEAR。现在是使用他们的时候了。我来解释它们(具体见红皮书,其实这是计算雾效混合因子的三种方式): 第三行glFogfv(GL_FOG_COLOR, fogcolor);设置雾的颜色。之前我们已将变量fogcolor设为(0.5f,0.5f,0.5f,1.0f),这是一个很棒的灰色。 接下来我们看看最后的四行。glFogf(GL_FOG_DENSITY, 0.35f);这行设置雾的密度。增加数字会让雾更密,减少它则雾更稀。 glHint (GL_FOG_HINT, GL_DONT_CARE); 设置修正。我使用了GL_DONT_CARE因为我不关心它的值。 Eric Desrosiers Adds:关于glHint(GL_FOG_HINT, hintval);的解释 gl_dont_care - 由OpenGL决定使用何种雾效(对每个顶点还是每个像素执行雾效计算)和一个未知的公式(?) 下一行glFogf(GL_FOG_START, 1.0f);设定雾效距屏幕多近开始。你可以根据你的需要随意改变这个值。下一行类似,glFogf(GL_FOG_END, 5.0f);告诉OpenGL程序雾效持续到距屏幕多远。 现在我们建立了绘制雾的代码,我们将加入键盘指令在不同的雾效模式间循环。这段代码及其它的按键处理代码在程序的最后。 |
if (keys['G'] && !gp) // G键是否 按下 { gp=TRUE; // 是 fogfilter+=1; // 变换雾气模式 if (fogfilter>2) // 模式是否大于2 { fogfilter=0; // 置零 } glFogi (GL_FOG_MODE, fogMode[fogfilter]); // 设置雾气模式 } if (!keys['G']) // G键是否释放 { gp=FALSE; // 是,设置为释放 }
就是这样!大功告成!现在你的OpenGl程序有了雾效。
|