歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenGL超級寶典學習筆記——霧

OpenGL超級寶典學習筆記——霧

日期:2017/3/1 9:32:23   编辑:Linux編程

應用霧

霧是OpenGL支持的一種易於使用的特殊效果。在使用霧時,OpenGL把霧的顏色與完成所有其他顏色計算的幾何圖元進行混合。霧與幾何圖元的混合程度取決於幾何圖元離觀察者的距離。霧可以使物體逐漸模糊最終消失在霧色裡(就像在霧中遠去的父親的背影)。

在SetupRC函數中開啟霧化效果。

glClearColor(fLowLight[0], fLowLight[1], fLowLight[2], fLowLight[3]);


glEnable(GL_FOG); 
glFogfv(GL_FOG_COLOR, fLowLight);
glFogf(GL_FOG_START, 5.0f);  
glFogf(GL_FOG_END, 30.0f); 
glFogi(GL_FOG_MODE, GL_LINEAR);

開啟和關閉霧化:

glEnable(GL_FOG); glDisable(GL_FOG);

設置霧化的參數使用glFog:

void glFogi(GLenum pname, GLint param);

void glFogf(GLenum pname, GLfloat param);

void glFogfv(GLenum pname, GLfloat *params);

void glFogiv(GLenum pname, GLint *params);

glFogfv(GL_FOG_COLOR, fLowLight); //設置霧的顏色與背景色相同

當使用GL_FOG_COLOR作為第一個參數時,後面的第二個參數是一個指定霧的顏色的數組。這裡我們使用了與背景清除色相同的顏色。

glFogf(GL_FOG_START, 5.0f);

glFogf(GL_FOG_END, 30.0f);

這兩行代碼設置了霧化的范圍,從哪裡(離觀察者多遠)開始霧化,到哪結束(此過程逐漸加深霧色)。在GL_FOG_END指定的位置,物體完全霧化,物體的顏色跟霧的顏色是一樣的。

霧化方程

glFogi(GL_FOG_MODE, GL_LINEAR); //使用哪一種霧化方程

霧化方程用於計算從起始到結束的霧化因子(0-1的范圍)。OpenGl支持的霧化方程如下:

霧化模式 霧化方程 GL_LINEAR f = (end – c) / (end – start) GL_EXP f = exp(-d * c) GL_EXP2 f = exp(-(d * c)2)

在方程裡,c是渲染片段離觀察平面的距離,end是GL_FOG_END指定的距離。start是GL_FOG_START指定的距離。d是霧色的濃度。通過glFogf設置

glFogf(GL_FOG_DENSITY, 0.5f);

GL_FOG_START和GL_FOG_END只影響GL_LINEAR的霧化效果。GL_LINEAR(線性模式)是線性的直線,GL_EXP和GL_EXP2(指數模式)是兩條特征曲線。如下圖霧化濃度值為0.5的近似圖:

在線性模式下,只需要提供一個距離視點的開始位置和結束位置。從開始位置到結束位置之間,霧的濃度越來越高,濃度的變化和距離成正比。在指數模式下,霧的濃度隨著距離的增加呈指數增長。這種模式通常用來用於煙霧、煙幕等效果。

在計算片段到觀察平面的距離有兩種方式。一種(尤其是在NVIDIA的硬件上)計算真實的片段的深度。另一種(尤其是A卡上)使用頂點的距離和頂點之間的插值。前者稱為片段霧,後者稱為頂點霧。片段霧比頂點霧更為復雜,但它顯示的效果更好。這兩種都可以通過GL_FOG_HINT來設置效果。更好的效果需要更大的開銷:

glHint(GL_FOG_HINT, GL_NICEST);

更快,但效果較差可以調用:

glHint(GL_FOG_HINT, GL_FASTEST);

具體的效果取決於實現。

霧坐標

我們不一定要OpenGL計算霧距離,也可以自己設置霧距離。通過手工調用glFogCoordf:

void glFogCoordf(GLfoat fFogDistance);

使用霧坐標的前提是,要調用下面的函數更改霧的來源:

glFogi(GL_FOG_COORD_SRC, GL_FOG_COORD);

打開OpenGl產生的霧值:

glFogi(GL_FOG_COORD_SRC, GL_FRAGMENT_DEPTH);

在上一篇的代碼的SetupRC中加入如下代碼段:

  glEnable(GL_FOG);
  glFogfv(GL_FOG_COLOR, fLowLight); 
  glFogf(GL_FOG_START, 0.5f); 
  glFogf(GL_FOG_END, 30.0f); 
  glFogi(GL_FOG_MODE, GL_LINEAR); 
  glHint(GL_FOG_HINT, GL_NICEST); //開啟最佳霧化效果

效果圖如下:

OpenGL超級寶典 第4版 中文版PDF+英文版+源代碼 見 http://www.linuxidc.com/Linux/2013-10/91413.htm

OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

更多《OpenGL超級寶典學習筆記》相關知識 見 http://www.linuxidc.com/search.aspx?where=nkey&keyword=34581

Copyright © Linux教程網 All Rights Reserved