📄 tutorial_16.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><!-- 这篇文章由Dancingwind翻译,作者的联系方式zhouwei02@mails.tsinghua.edu.cn --><title>NeHe OpenGL教程第十六课,DancingWind翻译</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">A:link {
COLOR: #ccaaff; TEXT-DECORATION: none
}
A:visited {
COLOR: #ccaaff; TEXT-DECORATION: none
}
A:active {
COLOR: #ccaaff; TEXT-DECORATION: none
}
A:hover {
COLOR: #ffccaa; TEXT-DECORATION: none
}
</style>
<meta content="Microsoft FrontPage 3.0" name="GENERATOR"></head><body bgcolor="#000000" text="#ffffff">
<br>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td height="130" width="326"><img src="Tutorial_16_files/logo.png" height="130" width="326"></td>
<td align="center" valign="center" width="75%"><div align="center"><font color="#ffccaa" size="+3"><b><i>第16课</i></b></font></div></td>
</tr>
</tbody>
</table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<!-- 中部-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<!-- 中部左边框-->
<td background="Tutorial_16_files/l.gif"><img src="Tutorial_16_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="29%"><img src="Tutorial_16_files/lesson16.jpg" height="180" width="240"></td>
<td width="71%"><p><font class="head">雾:</font></p>
<p><font size="3">这一课是基于第7课的代码的,你将学会三种不同的雾的计算方法,以及怎样设置雾的颜色和雾的范围。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_16_files/r.gif"><img src="Tutorial_16_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<!-- 下边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_16_files/l.gif"><img src="Tutorial_16_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">这篇教程由Chris Aliotta编写。
<p>你想给你的OpenGL程序添加雾效?我将在这篇教程中教你如何去做。这是我第一次写教程,我也只是OpenGL/C++编程的新手,所以如果你发现了什么错误请告诉我而不是叱责我。本课的代码基于第七课的代码编写。</p>
<p>Data Setup:</p>
<p>我们将从设置保存雾的信息的变量开始。变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2和GL_LINEAR。我将在稍后解释这三种类型的区别。这些变量位于程序开头GLuint
texture[3]这行后。变量fogfilter将用来表示我们使用的是哪种雾类型。变量fogColor保存雾的颜色。在程序的顶部我还加了一个布尔类型的变量gp用来记录'g'键是否被按下。<br>
</p></td>
<td background="Tutorial_16_files/r.gif"><img src="Tutorial_16_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre>bool gp; <font color="#ffffaa">// G健是否按下</font>
GLuint filter; <font color="#ffffaa">// 使用哪一个纹理过滤器</font>
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; <font color="#ffffaa"> // 雾气的模式</font>
GLuint fogfilter= 0; <font color="#ffffaa">// 使用哪一种雾气</font>
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; <font color="#ffffaa">// 雾的颜色设为白色</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_16_files/l.gif"><img src="Tutorial_16_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">现在我们已经设置了变量,接下来我们来看InitGL函数。为了获得更好的效果,glClearColor()这行已经被修改为将屏幕清为同雾相同的颜色。使用雾效只需很少的代码。总之你将发现这很容易。</td>
<td background="Tutorial_16_files/r.gif"><img src="Tutorial_16_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">glClearColor(0.5f,0.5f,0.5f,1.0f); <font color="#ffffaa">// 设置背景的颜色为雾气的颜色</font>
glFogi(GL_FOG_MODE, fogMode[fogfilter]); <font color="#ffffaa">// 设置雾气的模式</font>
glFogfv(GL_FOG_COLOR, fogColor); <font color="#ffffaa">// 设置雾的颜色</font>
glFogf(GL_FOG_DENSITY, 0.35f); <font color="#ffffaa">// 设置雾的密度</font>
glHint(GL_FOG_HINT, GL_DONT_CARE); <font color="#ffffaa">// 设置系统如何计算雾气</font>
glFogf(GL_FOG_START, 1.0f); <font color="#ffffaa">// 雾气的开始位置</font>
glFogf(GL_FOG_END, 5.0f); <font color="#ffffaa">// 雾气的结束位置</font>
glEnable(GL_FOG); <font color="#ffffaa">// 使用雾气</font></font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_16_files/l.gif"><img src="Tutorial_16_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%"><p><font face="arial">让我们先看看这段代码的头三行。第一行glEnable(GL_FOG);(?这应该是最后一行)不用再解释了吧,主要是初始化雾效。</font>
</p><p>第二行glFogi(GL_FOG_MODE, fogMode[fogfilter]);建立雾的过滤模式。之前我们声明了数组fogMode,它保存了值GL_EXP,
GL_EXP2, and GL_LINEAR。现在是使用他们的时候了。我来解释它们(具体见红皮书,其实这是计算雾效混合因子的三种方式):<br>
GL_EXP - 充满整个屏幕的基本渲染的雾。它能在较老的PC上工作,因此并不是特别像雾。 <br>
GL_EXP2 - 比GL_EXP更进一步。它也是充满整个屏幕,但它使屏幕看起来更有深度。 <br>
GL_LINEAR - 最好的渲染模式。物体淡入淡出的效果更自然。</p>
<p>第三行glFogfv(GL_FOG_COLOR, fogcolor);设置雾的颜色。之前我们已将变量fogcolor设为(0.5f,0.5f,0.5f,1.0f),这是一个很棒的灰色。</p>
<p>接下来我们看看最后的四行。glFogf(GL_FOG_DENSITY, 0.35f);这行设置雾的密度。增加数字会让雾更密,减少它则雾更稀。</p>
<p>glHint (GL_FOG_HINT, GL_DONT_CARE); 设置修正。我使用了GL_DONT_CARE因为我不关心它的值。</p>
<p>Eric Desrosiers Adds:关于glHint(GL_FOG_HINT, hintval);的解释</p>
<p>gl_dont_care - 由OpenGL决定使用何种雾效(对每个顶点还是每个像素执行雾效计算)和一个未知的公式(?)<br>
gl_nicest - 对每个像素执行雾效计算(效果好)<br>
gl_fastest - 对每个顶点执行雾效计算 (更快,但效果不如上面的好)</p>
<p>下一行glFogf(GL_FOG_START, 1.0f);设定雾效距屏幕多近开始。你可以根据你的需要随意改变这个值。下一行类似,glFogf(GL_FOG_END,
5.0f);告诉OpenGL程序雾效持续到距屏幕多远。</p>
<p>现在我们建立了绘制雾的代码,我们将加入键盘指令在不同的雾效模式间循环。这段代码及其它的按键处理代码在程序的最后。<br>
</p></td>
<td background="Tutorial_16_files/r.gif"><img src="Tutorial_16_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre>if (keys['G'] && !gp) <font color="#ffffaa">// G键是否 按下</font>
{
gp=TRUE; <font color="#ffffaa">// 是<font color="#aaffaa"></font></font>
fogfilter+=1; <font color="#ffffaa">// 变换雾气模式</font>
if (fogfilter>2) <font color="#ffffaa">// 模式是否大</font><font color="#aaffaa" size="3"><font color="#ffffaa">于</font></font><font color="#ffffaa">2</font>
{
fogfilter=0; <font color="#ffffaa">// 置零</font>
}
glFogi (GL_FOG_MODE, fogMode[fogfilter]); <font color="#ffffaa"> // 设置雾气模式</font>
}
if (!keys['G']) <font color="#ffffaa">// G键是否释放</font>
{
gp=FALSE; <font color="#ffffaa">// 是,设置为释放</font>
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_16_files/l.gif"><img src="Tutorial_16_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%"><p>就是这样!大功告成!现在你的OpenGl程序有了雾效。 </p>
<table border="1" width="100%">
<tbody><tr>
<td width="27%"><img src="Tutorial_16_files/logo%25203.jpg" align="middle" height="200" width="209"></td>
<td width="73%">版权与使用声明:<br>
我是个对学习和生活充满激情的普通男孩,在网络上我以DancingWind为昵称,我的联系方式是zhouwei02@mails.tsinghua.edu.cn,如果你有任何问题,都可以联系我。
<p>引子<br>
网络是一个共享的资源,但我在自己的学习生涯中浪费大量的时间去搜索可用的资料,在现实生活中花费了大量的金钱和时间在书店中寻找资料,于是我给自己起了
个昵称DancingWind,其意义是想风一样从各个知识的站点中吸取成长的养料。在飘荡了多年之后,我决定把自己收集的资料整理为一个统一的资源库。</p>
<p>版权声明<br>
所有DancingWind发表的内容,大多都来自共享的资源,所以我没有资格把它们据为己有,或声称自己为这些资源作出了一点贡献。故任何人都可以复
制,修改,重新发表,甚至以自己的名义发表,我都不会追究,但你在做以上事情的时候必须保证内容的完整性,给后来的人一个完整的教程。最后,任何人不能以
这些资料的任何部分,谋取任何形式的报酬。</p>
<p>发展计划<br>
在国外,很多资料都是很多人花费几年的时间慢慢积累起来的。如果任何人有兴趣与别人共享你的知识,我很欢迎你与我联系,但你必须同意我上面的声明。</p>
<p>感谢<br>
感谢我的母亲一直以来对我的支持和在生活上的照顾。<br>
感谢我深爱的女友田芹,一直以来默默的在精神上和生活中对我的支持,她甚至把买衣服的钱都用来给我买书了,她真的是我见过的最好的女孩,希望我能带给她幸福。</p>
<p>资源下载: <br>
文档 <a href="http://www.owlei.com/DancingWind/Res/mht/NeHe%20OpenGL%20Chinese%20Course%2016.mht">网页格式</a>
<a href="http://www.owlei.com/DancingWind/Res/pdf/OpenGL_Nehe_Course_Tutorial_16.pdf">PDF格式</a><br>
源码 <a href="http://www.owlei.com/DancingWind/Res/Src/16_Fog.rar">RAR格式</a></p></td>
</tr>
</tbody></table>
<table border="0" width="100%">
<tbody>
<tr>
<td align="left" width="50%"><a href="http://www.owlei.com/DancingWind/Course/Tutorial_15.htm"><b><font size="-1"><
第15课</font></b></a></td>
<td align="right" width="50%"><a href="http://www.owlei.com/DancingWind/Course/Tutorial_17.htm"><b><font size="-1">第17课
></font></b></a></td>
</tr>
</tbody>
</table>
</td>
<td background="Tutorial_16_files/r.gif"><img src="Tutorial_16_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_16_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_16_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_16_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -