Add Fog in OpenGL (L8)

2015-12-09_153339本篇要介紹如何在 Screen 裡面加入『霧』,方法很簡單,只要定義好 fog 的參數就可以使用,有點像 Lighting (L3) 。只要 follow 以下的 code:


fogMode[0] = GL_EXP; fogMode[1] = GL_EXP2; fogMode[2] = GL_LINEAR;
fogfilter = 2;
GLfloat fogColor[4] = {0.6f, 0.6f, 0.6f, 1.0f};
glFogi(GL_FOG_MODE, fogMode[fogfilter]);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 0.05f);
glHint(GL_FOG_HINT, GL_DONT_CARE);
glFogf(GL_FOG_START, 15.0f);
glFogf(GL_FOG_END, 25.0f);
glEnable(GL_FOG);

在 initializeGL() 裡面,定義 fog 參數。

glFogfv(GL_FOG_COLOR, fogColor) 定義 fog 的顏色,霧不一定要是灰階,也可以是有顏色的霧。

glHint(GL_FOG_HINT, GL_DONT_CARE) 這行表示霧這個濾鏡的形式,GL_DONT_CARE 表示讓 OpenGL 本身自己決定,還有另外兩個分別是 GL_NICEST : 表示最佳的濾鏡型態和 GL_FASTEST : 速度最快的 rendering方式。

glEnable(GL_FOG) 和 glDisable(GL_FOG) 為霧氣的開關。

glFogi(GL_FOG_MODE, fogMode[fogfilter]) 表示選擇的霧氣型態,這裡有三個參數:

  1. GL_EXP 是最基礎的 fog 型態,是以一階指數函數來決定霧氣的濃度。霧氣的影響會佈滿所有畫面。
  2. GL_EXP2 則是以二階指數函數來決定霧氣的濃度。霧氣的影響也是會佈滿整個畫面。
  3. GL_LINEAR 霧氣分布呈現線性的,且用 GL_LINEAR 可以決定霧氣的分佈距離。

            expFogGraph (1)exp2FogGraphlinearFogGraph                                                     [GL_EXP;GL_EXP2;GL_LINEAR]

glFogf(GL_FOG_DENSITY, 0.03f) 這行為定義霧氣的強度,介於 0.0~1.0 之間,但這行對 GL_LINEAR 是無用的,因為 GL_LINEAR 的強度會與設定的距離有關。

glFogf(GL_FOG_START, 15.0f)glFogf(GL_FOG_END, 25.0f) 這兩個參數分別設定霧氣的起始點與終點。起始點的霧氣強度是 0.0f,終點的霧氣強度是1.0f,所以這個參數只與 fogMode 是 GL_LINEAR 有關,與 GL_EXPGL_EXP2 無關。

設定好了 fog 參數後,記得在 painGL() function 裡加入 glClearColor(0.6f, 0.6f, 0.6f, 1.0f) 把背景改成與 fog 相同的顏色,這樣 Object 才會像是處在濃霧裡。


在不同顏色霧氣下的結果:

picasion.com_50518dfbf6cbf97a4888b0d25d99e518

 

 


reference : http://nehe.gamedev.net/tutorial/cool_looking_fog/19001/

http://www.mbsoftworks.sk/index.php?page=tutorials&series=1&tutorial=15

 

Leave a Reply

Your email address will not be published. Required fields are marked *