OpenGL超級寶典筆記——霧

應用霧

霧是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指定的位置,物體徹底霧化,物體的顏色跟霧的顏色是同樣的。

霧化方程

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的近似圖:

image

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

在計算片斷到觀察平面的距離有兩種方式。一種(尤爲是在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); //開啓最佳霧化效果


效果圖以下:

image

相關文章
相關標籤/搜索