OpenGL函式思考 glBlendFunc

2021-06-03 17:27:27 字數 2287 閱讀 4466

opengl函式思考-glblendfunc

函式原型:

void glblendfunc(glenum sfactor,glenum dfactor)

引數說明:

函式說明:

在rgb模式下,可以使用把引入的rgba值(源)與幀快取中的rgba值(目標)相融合的融合函式來繪製畫素。預設時,融合是關閉的,可以使用glenable(gl_blend)來啟用融合。

當啟用融合時,可以使用glblendfunc函式定義融合操作。

opengl 會把源顏色和目標顏色各自取出,並乘以乙個係數(源顏色乘以的係數稱為「源因子」,目標顏色乘以的係數稱為「目標因子」),然後相加,這樣就得到了新的顏 色。(也可以不是相加,新版本的opengl可以設定運算方式,包括加、減、取兩者中較大的、取兩者中較小的、邏輯運算等,但我們這裡為了簡單起見,不討 論這個了)

下面用數學公式來表達一下這個運算方式。假設源顏色的四個分量(指紅色,綠色,藍色,alpha值)是(rs, gs, bs, as),目標顏色的四個分量是(rd, gd, bd, ad),又設源因子為(sr, sg, sb, sa),目標因子為(dr, dg, db, da)。則混合產生的新顏色可以表示為:

(rs*sr+rd*dr, gs*sg+gd*dg, bs*sb+bd*db, as*sa+ad*da)

當然了,如果顏色的某一分量超過了1.0,則它會被自動擷取為1.0,不需要考慮越界的問題。

源因子和目標因子是可以通過glblendfunc函式來進行設定的。glblendfunc有兩個引數,前者表示源因子,後者表示目標因子。這兩個引數可以是多種值,下面介紹比較常用的幾種。

gl_zero:     表示使用0.0作為因子,實際上相當於不使用這種顏色參與混合運算。

gl_one:      表示使用1.0作為因子,實際上相當於完全的使用了這種顏色參與混合運算。

gl_src_alpha:表示使用源顏色的alpha值來作為因子。

gl_dst_alpha:表示使用目標顏色的alpha值來作為因子。

gl_one_minus_src_alpha:表示用1.0減去源顏色的alpha值來作為因子。

gl_one_minus_dst_alpha:表示用1.0減去目標顏色的alpha值來作為因子。

除 此以外,還有gl_src_color(把源顏色的四個分量分別作為因子的四個分量)、gl_one_minus_src_color、 gl_dst_color、gl_one_minus_dst_color等,前兩個在opengl舊版本中只能用於設定目標因子,後兩個在opengl 舊版本中只能用於設定源因子。新版本的opengl則沒有這個限制,並且支援新的gl_const_color(設定一種常數顏色,將其四個分量分別作為 因子的四個分量)、gl_one_minus_const_color、gl_const_alpha、 gl_one_minus_const_alpha。另外還有gl_src_alpha_saturate。新版本的opengl還允許顏色的alpha 值和rgb值採用不同的混合因子。

舉例來說:

如果設定了glblendfunc(gl_one, gl_zero);,則表示完全使用源顏色,完全不使用目標顏色,因此畫面效果和不使用混合的時候一致(當然效率可能會低一點點)。如果沒有設定源因子和目標因子,則預設情況就是這樣的設定。

如果設定了glblendfunc(gl_zero, gl_one);,則表示完全不使用源顏色,因此無論你想畫什麼,最後都不會被畫上去了。(但這並不是說這樣設定就沒有用,有些時候可能有特殊用途)

如果設定了glblendfunc(gl_src_alpha, gl_one_minus_src_alpha);,則表示源顏色乘以自身的alpha 值,目標顏色乘以1.0減去源顏色的alpha值,這樣一來,源顏色的alpha值越大,則產生的新顏色中源顏色所佔比例就越大,而目標顏色所佔比例則減 小。這種情況下,我們可以簡單的將源顏色的alpha值理解為「不透明度」。這也是混合時最常用的方式。

如果設定了glblendfunc(gl_one, gl_one);,則表示完全使用源顏色和目標顏色,最終的顏色實際上就是兩種顏色的簡單相加。例如紅色(1, 0, 0)和綠色(0, 1, 0)相加得到(1, 1, 0),結果為黃色。

注意:      所謂源顏色和目標顏色,是跟繪製的順序有關的。假如先繪製了乙個紅色的物體,再在其上繪製綠色的物體。則綠色是源顏色,紅色是目標顏色。如果順序反過來,則 紅色就是源顏色,綠色才是目標顏色。在繪製時,應該注意順序,使得繪製的源顏色與設定的源因子對應,目標顏色與設定的目標因子對應。不要被混亂的順序搞暈 了。

OpenGL函式思考 gluLookAt

opengl函式思考 glulookat 函式原型 void glulookat gldouble eyex,gldouble eyey,gldouble eyez,gldouble centerx,gldouble centery,gldouble centerz,gldouble upx,gld...

OpenGL函式思考 glLoadIdentity

函式原型 void glloadidentity void 函式說明 opengl為我們提供了乙個非常簡單的恢復初始座標系的手段,那就是呼叫glloadidentity 命令。該命令是乙個無參的無值函式,其功能是用乙個4 4的單位矩陣來替換當前矩陣,實際上就是對當前矩陣進行初始化。也就是說,無論以前...

OpenGL函式思考 glMatrixMode

函式原型 void glmatrixmode glenum mode 引數說明 mode 指定哪乙個矩陣堆疊是下乙個矩陣操作的目標,可選值 在每個矩陣模式下都有乙個矩陣對陣,在gl modelview模式中,堆疊深度至少為32 在gl projection和gl texture模式中,堆疊深度至少為...