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 ) |
默認使用GL_FUNC_ADD的混合方程,這時需要指定的參數爲混色因子
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)
綠色背景,紅色矩形
關閉混合時 打開混合時 疊加時顏色
結果:
1、背景色也參與混合過程;
2、利用綠色背景測試可得,RGBA中的A值對單一顏色顯示沒有效果,但混合和
透明是依靠A值計算的;
3、當輸入顏色值爲RGB時,混合計算時,A值默認爲0.0。