霧是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指定的位置,物體完全霧化,物體的顏色跟霧的顏色是一樣的。
霧化方程用於計算從起始到結束的霧化因子(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