霧是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);
開啓和關閉霧化:spa
glEnable(GL_FOG); glDisable(GL_FOG);.net
設置霧化的參數使用glFog:code
void glFogi(GLenum pname, GLint param);ci
void glFogf(GLenum pname, GLfloat param);get
void glFogfv(GLenum pname, GLfloat *params);it
void glFogiv(GLenum pname, GLint *params);table
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); //開啓最佳霧化效果
效果圖以下: