OpenGL超級寶典筆記——霧

OpenGL超級寶典筆記——霧
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

應用霧

霧是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_LINEARf = (end – c) / (end – start)
GL_EXPf = exp(-d * c)
GL_EXP2f = 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


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}

人工智慧 最新文章