1. 程式人生 > >opengl 紋理混合 glBlendFunc

opengl 紋理混合 glBlendFunc

glBlendFunc

public void glBlendFunc(int sfactor,int dfactor)

功能

指明畫素演算法。

詳細

畫素可以通過函式操作後被繪出,該函式的功能是將引入的值與顏色緩衝中已有的值混合。使用glEnable方法與glDisable方法以GL_BLEND為引數,決定是否開啟混合功能,該功能初始為關閉的。

當混合功能開啟時glBlendFunc定義混合功能的操作。sfactor指明十一中方法中的哪一種用來衡量源顏色要素,dfactor指明十種方法中的哪一種用來衡量目的顏色要素。十一種可能的方法將在下面進行介紹。每一種方法定義了四個衡量元素,分別是紅、綠、藍和 alpha。

在後面的內容中,源與目的顏色要素被指為(Rs, Gs, Bs, As)和(Rd, Gd, Bd, Ad),它們的值為0至(kR, kG, kB, kA)之間的整數,其中kc = 2mc – 1,並且(mR, mG, mB, mA)是紅、綠、藍和alpha位平面的數量。

源和目標比例係數由(sR, sG, sB, sA)和(dR, dG, dB, dA)指定。比例係數用(fR, fG, fB, fA)表示,代表既不是源也不是目標因素,所有比例係數屬於區間[0, 1]。

引數     (fR, fG, fB, fA)

GL_ZERO (0, 0, 0, 0)

GL_ONE (1, 1, 1, 1)

GL_SRC_COLOR (Rs/kR, Gs/kG, Bs/kB, As/kA )

GL_ONE_MINUS_SRC_COLOR (1, 1, 1, 1) - (Rs/kR, Gs/kG, Bs/kB, As/kA)

GL_DST_COLOR (Rd/kR, Gd/kG, Bd/kB, Ad/kA )

GL_ONE_MINUS_DST_COLOR (1, 1, 1, 1) - (Rd/kR, Gd/kG, Bd/kB, Ad/kA)

GL_SRC_ALPHA (As/kA, As/kA, As/kA, As/kA )

GL_ONE_MINUS_SRC_ALPHA (1, 1, 1, 1) -(As/kA, As/kA, As/kA, As/kA)

GL_DST_ALPHA (Ad/kA, Ad/kA, Ad/kA, Ad/kA )

GL_ONE_MINUS_DST_ALPHA (1, 1, 1, 1) -(Ad/kA, Ad/kA, Ad/kA, Ad/kA)

GL_SRC_ALPHA_SATURATE (i, i, i, 1)  i = min(As, kA - Ad) / kA

為了確定畫素的混合值,系統利用下列等式。

Rd = min( kR, Rs sR + Rd dR )

Gd = min( kG, Gs sG + Gd dG )

Bd = min( kB, Bs sB + Bd dB )

Ad = min( kA, As sA + Ad dA )

儘管從表面上看混合演算法並沒有指明上述等式的精度,因為混合操作是採用不精確的整型顏色值。然而應當等於1的混合因素要被確保沒有修改它的被乘數,並且一個等於0的混合因素要降低它的被乘數至0。舉一個例子,當sfactor是GL_SRC_ALPHA,dfactor 是GL_ONE_MINUS_SRC_ALPHA並且As等於kA時,等式進行簡單替換。

Rd = Rs

Gd = Gs

Bd = Bs

Ad = As

對於所有畫素元素的寫入操作進行glBlendFunc操作時,包括對於點、線、多邊形的掃描轉換,都不影響glClear方法。

舉例

為了渲染物體從遠到近排列的效果,最好應用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)處理透明度。請注意這個透明度計算不要求存在顏色緩衝區中的alpha位面數。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)對於渲染抗鋸齒的點和線也很有效。

注意

引入的(源)alpha被認為是不透明的,範圍是1.0 (kA),表明完全不透明,而0表明完全透明。

錯誤

當sfactor或dfactor為不允許的值時,產生GL_INVALID_ENUM(錯誤列舉)。

引數

sfactor——指明源圖元的紅、綠、藍、alpha的混合比例是怎樣計算的。允許的符號符號常量有:GL_ZERO, GL_ONE,GL_SRC_COLOR (僅1.1), GL_ONE_MINUS_SRC_COLOR (僅1.1), GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, 和 GL_SRC_ALPHA_SATURATE,初始值是GL_ONE。

dfactor——指明目圖元的紅、綠、藍、alpha的混合比例是怎樣計算的。允許的符號符號常量有:GL_ZERO, GL_ONE,GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR (僅1.1),GL_ONE_MINUS_DST_COLOR (僅1.1), GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, 和 GL_ONE_MINUS_DST_ALPHA,初始值為GL_ZERO

網路解釋

第一個引數指出源圖元的alpha的取值計算方法,第二個引數指出目標處的alpha的計算方法。
兩個引數的取值都可以是如下常量之一:
GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, and GL_SRC_ALPHA_SATURATE
比如GL_ZERO表示alpha取值為0,GL_ONE表示1,GL_DST_COLOR表示取目標區域的顏色值,GL_SRC_ALPHA表示取源區域的alpha值等等。例如:
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
表示把渲染的影象疊加到目標區域,也就是說源的每一個畫素的alpha都等於自己的alpha,目標的每一個畫素的alpha等於1。這樣疊加次數越多,疊加的圖元的alpha越高,得到的結果就越亮。因此這種融合用於表達光亮效果。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
表示把渲染的影象融合到目標區域。也就是說源的每一個畫素的alpha都等於自己的alpha,目標的每一個畫素的alpha等於1減去該位置源畫素的alpha。 因此不論疊加多少次,亮度是不變的。