天天看點

OpenGL中的混合 (blend)

    Blend 混合是将源色和目标色以某種方式混合生成特效的技術。混合常用來繪制透明或半透明的物體。在混合中起關鍵作用的α值實際上是将源色和目标色按給定比率進行混合,以達到不同程度的透明。α值為0則完全透明,α值為1則完全不透明。混合操作隻能在RGBA模式下進行,顔色索引模式下無法指定α值。物體的繪制順序會影響到OpenGL的混合處理。

glEnable( GL_BLEND );   // 啟用混合

glDisable( GL_BLEND );  // 禁用關閉混合

獲得混合的資訊

glGet( GL_BLEND_SRC );

glGet( GL_BLEND_DST );

glIsEnable( GL_BLEND );

glBlendFunc( GLenum sfactor , GLenum dfactor );         // 混合函數

sfactor 源混合因子

dfactor 目标混合因子

混合因子枚舉

GL_DST_ALPHA ( Ad , Ad , Ad , Ad )
GL_DST_COLOR ( Rd , Gd , Bd , Ad )
GL_ONE (1,1,1,1)
GL_ONE_MINUS_DST_ALPHA (1,1,1,1) - (Ad,Ad,Ad,Ad)
GL_ONE_MINUS_DST_COLOR (1,1,1,1) - (Rd,Gd,Bd,Ad)
GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) - (As,As,As,As)
GL_SRC_ALPHA ( As , As , As , As )
GL_SRC_ALPHA_SATURATE (f,f,f,1) : f = min(As,1-Ad)
GL_ZERO ( 0 , 0 , 0 , 0 )

glBlendFunc( GL_ONE , GL_ZERO );        // 源色将覆寫目标色

glBlendFunc( GL_ZERO , GL_ONE );        // 目标色将覆寫源色

glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的

若源色為 ( 1.0 , 0.9 , 0.7 , 0.8 )

源色使用 GL_SRC_ALPHA

即 0.8*1.0 , 0.8*0.9 , 0.8*0.8 , 0.8*0.7

結果為 0.8 , 0.72 , 0.64 , 0.56

目标色為 ( 0.6 , 0.5 , 0.4 , 0.3 )

目标色使用GL_ONE_MINUS_SRC_ALPHA

即 1 - 0.8 = 0.2

0.2*0.6 , 0.2*0.5 , 0.2*0.4 , 0.2*0.3

結果為 0.12 , 0.1 , 0.08 , 0.06

由此而見,使用這個混合函數,源色的α值決定了結果顔色的百分比。

這裡源色的α值為0.8,即結果顔色中源色占80%,目标色占20%。

将多邊形從遠至近排列,并使用以下函數

glBlendFunc( GL_SRC_ALPHA_SATURATE , GL_ONE );

glEnable( GL_POLYGON_SMOOTH );

可以優化多邊形反走樣;但必須有α位平面,以用來存儲累加的覆寫值。

混合 3D 物體

混合 3D 物體時,基本原理和混合2D物體一樣,但需要将深層檢測關閉或設定為隻讀。

因為深層檢測會剔除被遮擋的部分物體。

glEnable( GL_DEPTH_TEST );          // 啟用深度緩存

glDisable( GL_DEPTH_TEST );         // 禁用深度緩存

glDepthMask( GL_FALSE );              // 深度緩存為 隻讀

glDepthMask( GL_TRUE );               // 深度緩存為 讀/寫

按以下步驟,可以在 3D 場景中使用混合和深層檢測

1、使用深層檢測

2、繪制不透明的物體

3、設隻讀 深層檢測

4、繪制半透明的物體

5、設 讀/寫 深層檢測

以下對混合算法進行測試,統一使用glBlendFunc(GL_SRC_ALPHA,GL_ONE);模式。

glClearColor(0.0f,1.0f,0.0f,0.5f);               //綠色背景(目标)、先放入幀緩沖區

glColor4f(1.0f,0.0f,0.0f,0.5f);                    //矩形顔色(源色)、片段

計算結果:

(0.5f, 1.0f,0.0f,0.75f)

綠色背景,紅色矩形

OpenGL中的混合 (blend)
OpenGL中的混合 (blend)
OpenGL中的混合 (blend)

       關閉混合時                        打開混合時            疊加時顔色

結果:

1、背景色也參與混合過程;

2、利用綠色背景測試可得,RGBA中的A值對單一顔色顯示沒有效果,但混合和

透明是依靠A值計算的;

3、當輸入顔色值為RGB時,混合計算時,A值預設為0.0。

繼續閱讀