转自【翻译】NeHe OpenGL 教程

前言

声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改。对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢。

NeHe OpenGL第十六课:雾

雾:

这一课是基于第7课的代码的,你将学会三种不同的雾的计算方法,以及怎样设置雾的颜色和雾的范围。

这篇教程由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。现在是使用他们的时候了。我来解释它们(具体见红皮书,其实这是计算雾效混合因子的三种方式):

GL_EXP - 充满整个屏幕的基本渲染的雾。它能在较老的PC上工作,因此并不是特别像雾。

GL_EXP2 - 比GL_EXP更进一步。它也是充满整个屏幕,但它使屏幕看起来更有深度。

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决定使用何种雾效(对每个顶点还是每个像素执行雾效计算)和一个未知的公式(?)

gl_nicest - 对每个像素执行雾效计算(效果好)

gl_fastest - 对每个顶点执行雾效计算 (更快,但效果不如上面的好)

下一行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;      // 是,设置为释放

}

原文及其个版本源代码下载:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=16

 
 

NeHe OpenGL教程 第十六课:雾的更多相关文章

  1. NeHe OpenGL教程 第二十六课:反射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. NeHe OpenGL教程 第二十四课:扩展

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. NeHe OpenGL教程 第二十二课:凹凸映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第十二课:显示列表

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第二十九课:Blt函数

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. NeHe OpenGL教程 第二十八课:贝塞尔曲面

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. NeHe OpenGL教程 第二十五课:变形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. NeHe OpenGL教程 第十九课:粒子系统

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. NeHe OpenGL教程 第十八课:二次几何体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. Android--解析XML之SAX

    前言 既然要说XML解析,那么先来聊聊什么是XML.XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义 ...

  2. 如何在远程计算机上运行PowerShell

    问题: 不能在WORKGROUP里面的远程计算机里运行PowerShell指令,报错为用户名密码错 解决方法: 把两台机器上(远程计算机其和本机)都加入到trustedhosts 具体请参考 http ...

  3. 《苹果开发之Cocoa编程》挑战1 创建委托 练习

    <苹果开发之Cocoa编程>第4版 P87 新建一个单窗口应用程序,设置某对象为窗口的委托,当用户调整窗口尺寸时,确保窗口高度为宽度的2倍. 需要实现的委托方法为:-(NSSize)win ...

  4. C++@冒号(:)和双冒号(::)的用法

    转自:http://blog.csdn.net/zimingjushi/article/details/6549390 1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bit空间) ty ...

  5. 论文笔记之: Recurrent Models of Visual Attention

    Recurrent Models of Visual Attention Google DeepMind 模拟人类看东西的方式,我们并非将目光放在整张图像上,尽管有时候会从总体上对目标进行把握,但是也 ...

  6. CentOS 6.5系统上安装SVN服务器端的方法及步骤

    VN其实就是Subversion,分为服务器端和客户端.之前在网上搜了很多方法,都有各种问题,经过自己搜集整理以及实际尝试,总算有个比较靠谱的方法.本文主要介绍CentOS 6.5系统上安装SVN服务 ...

  7. 如何在asp.net中获取GridView隐藏列的值?

    在阅读本文之前,我获取gridview某行某列的值一般做法是这样的:row.Cells[3].Text.ToString().有点傻瓜呵呵 在Asp.net 2.0中增加了一个新的数据绑定控件:Gri ...

  8. C++流格式控制符的使用【来自网络】

    注意添加<iomanip>头文件. 使用控制符控制输出格式 控制符 作用 dec 设置整数的基数为10 hex 设置整数的基数为16 oct 设置整数的基数为8 setbase(n) 设置 ...

  9. python批量制作雷达图

    老板要画雷达图,但是数据好多组怎么办?不能一个一个点excel去画吧,那么可以利用python进行批量制作,得到样式如下: 首先制作一个演示的excel,评分为excel随机数生成: 1 =INT(( ...

  10. ubuntu 安装 boost

    1.tar -zxvf  boost_1_43_0.tar.gz 2.cd boost_1_43_0, 执行: sudo ./bootstrap.sh sudo ./bjam install 检验安装 ...