游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3150|回复: 2

NeHe OpenGL Tutorial Lesson 16

[复制链接]

7

主题

10

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-8-12 10:19:00 | 显示全部楼层 |阅读模式
Lesson 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 Pressed? ( New )
GLuint filter;                                                // Which Filter To Use
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };        // Storage For Three Types Of Fog
GLuint fogfilter= 0;                                        // Which Fog To Use
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};                // Fog Color

DrawGLScene Setup

现在我们已经设置了变量,接下来我们来看InitGL函数。为了获得更好的效果,glClearColor()这行已经被修改为将屏幕清为同雾相同的颜色。使用雾效只需很少的代码。总之你将发现这很容易。

glClearColor(0.5f,0.5f,0.5f,1.0f);                        // We'll Clear To The Color Of The Fog ( Modified )

glFogi(GL_FOG_MODE, fogMode[fogfilter]);                // Fog Mode
glFogfv(GL_FOG_COLOR, fogColor);                        // Set Fog Color
glFogf(GL_FOG_DENSITY, 0.35f);                                // How Dense Will The Fog Be
glHint(GL_FOG_HINT, GL_DONT_CARE);                        // Fog Hint Value
glFogf(GL_FOG_START, 1.0f);                                // Fog Start Depth
glFogf(GL_FOG_END, 5.0f);                                // Fog End Depth
glEnable(GL_FOG);                                        // Enables 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程序雾效持续到距屏幕多远。

Keypress Events

现在我们建立了绘制雾的代码,我们将加入键盘指令在不同的雾效模式间循环。这段代码及其它的按键处理代码在程序的最后。

if (keys['G'] && !gp)                                        // Is The G Key Being Pressed?
{
        gp=TRUE;                                        // gp Is Set To TRUE
        fogfilter+=1;                                        // Increase fogfilter By One
        if (fogfilter>2)                                // Is fogfilter Greater Than 2?
        {
                fogfilter=0;                                // If So, Set fogfilter To Zero
        }
        glFogi (GL_FOG_MODE, fogMode[fogfilter]);        // Fog Mode
}
if (!keys['G'])                                                // Has The G Key Been Released?
{
        gp=FALSE;                                        // If So, gp Is Set To FALSE
}

就是这样!大功告成!现在你的OpenGl程序有了雾效。

翻译:李铧犁 lihuali1985@hotmail.com
2005-8-11

0

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2005-9-23 08:21:00 | 显示全部楼层

Re:NeHe OpenGL Tutorial Lesson 16

0

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2005-9-30 23:16:00 | 显示全部楼层

Re:NeHe OpenGL Tutorial Lesson 16

强 ,,NeHe OpenGL Tutorial Lesson 的其他课程有没有汉语的??啊!
那里可以找到 谢谢了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-28 01:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表