您的位置:首页 > Web前端

Jeff Molofee(NeHe)的OpenGL教程

2006-11-03 19:28 330 查看
原 文Lesson 16: Cool Looking Fog
译 者sakura



  难道你不想把“雾”加入到你的OpenGL程序中吗?那么在这课里我将要为您展现如何实现这项功能。这是我第一次写教程,而且相对来说我也是OpenGL/C++程序设计新手,所以如果您发现有什么错误的话,请让我知道。这课的代码是基于第7课的。

  数据设定
  我们将要设定我们用来保存关于雾的信息的所有变量。变量fogMode,用来保存3种有关雾的类型:GL_EXP,GL_EXP2,GL_LINEAR。稍后我会解释这三种类型间的差别。这个变量将在代码的开头声明。变量fogfilter,将被用做记录您所选择的雾的类型的索引。变量fogColor会保存任何您想要的雾的颜色。我们当然也要在代码开始处加入一个布尔类型的变量gp使我们能够知道键“G”是否被按下。

  bool gp;                      // 键G按下了吗?(新增)
  GLuint filter;                    // 使用哪种滤波方式?
  GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };  // 储存雾的3种类型
  GLuint fogfilter= 0;                 //
  GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};    // 雾的颜色

  场景绘制设定
  现在我们已经声明完了我们的变量,接下来我们将要开始初始化OpenGL了。命令:glClearColor()将会稍做改变以用来将屏幕颜色清除为雾的颜色以获得更好的视觉效果。这里并没有复杂的代码用来进行雾的操作,而且您会发现,这将是非常简单的。

  glClearColor(0.5f,0.5f,0.5f,1.0f);

  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

  让我们讨论一下上面代码的开始3行。
  第一行glEnable(GL_FOG)解释起来非常容易,它告诉OpenGL开始进行雾的计算。
  第二行glFogi(GL_FOG_MODE,fogMode[fogfilter])确定了雾的类型。开始的时候我们声明了数组fogMode,它保存了GL_EXP,GL_EXP2,GL_LINEAR。在我们使用这些值之前,让我稍做解释:

GL_EXP:简单渲染在屏幕上显示的雾的模式。它无法给予我们非常漂亮的雾的效果,但是却可以在古老的电脑上工作的很好。

GL_EXP2:比1提高了一点,将渲染全屏幕的雾,然而她会给予场景更深的效果。

GL_LINEAR:这是最好的雾的渲染模式,对象在雾中消隐的很好。

  第三行glFogfv(GL-FOG_COLOR,fogcolor)设定了雾的颜色,开始的时候我们把它设定为(0.5,0.5,0.5,1.0),使用变量fogcolor将给予我们漂亮的灰色。
  接下来我们来看最后四行代码:
  glFogf(GL_FOG_DENSITY, 0.35f)确定了雾的密度,增大这个数值雾将会变的更浓,减小它雾将会变的更淡。
  glHint(GL_FOG_HINT, GL_DONT_CARE)确定了雾的渲染方式,我使用GL_DONT_CARE是因为我并不关心建议值。然而这里有一个用来解释关于这个项的不同值之间的区别:  

GK_DONT_CARE:让OPENGL自己来确定雾的渲染方式,每顶点或是每像素。

GL_NICEST:对每一像素进行雾的渲染,它看起来是极棒的。

GL_FASTEST:对每一顶点进行雾的渲染,它速度较快,但是不够美丽。

  glFogf(GL_FOG_START, 1.0f)确定了雾的开始初离屏幕有多近。你可以将这个值改变为任意你想要的值,这个值描述了那个你想要使雾开始的位置。下一行与上行相似:glFogf(GL_FOG_END, 5.0),它告诉OpenGL雾能离开屏幕有多远。

  按键事件

  if (keys['G'] && !gp)             // G键按下了吗?
  {
    gp=TRUE;                  // 将标志设定为“真”
    fogfilter+=1;               // 改变索引
    if (fogfilter>2)              // 将索引限制在[0,2]之间
    {
      fogfiltr=0;
    }
    glFogi (GL_FOG_MODE, fogMode[fogfilter]); // 雾的模式
  }

  if (!keys['G'])                // G键被释放了吗?
  {
    gp=FALSE;                 //
  }

  这就是全部了!我们结束了我们的课程,现在你已经在你的OPENGL程序中有了雾。我敢说这是决不费事的。如果你有任何问题或者意见,请来信或者访问我(译者)的网站。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: