• NeHe OpenGL教程 第十六课:雾


    转自【翻译】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

     
     
  • 相关阅读:
    【转】JS模块化工具requirejs教程(二):基本知识
    【转】JS模块化工具requirejs教程(一):初识requirejs
    【转】批处理命令 For循环命令详解!
    【转】NodeJS教程--基于ExpressJS框架的文件上传
    【转】WebSocket 是什么原理?为什么可以实现持久连接?
    网页工具地址
    【转】DataURL在Web浏览器中的兼容性总结
    侯捷STL学习(一)--顺序容器测试
    strstr-strcat实现
    算法设计与分析
  • 原文地址:https://www.cnblogs.com/arxive/p/6239463.html
Copyright © 2020-2023  润新知