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)
綠色背景,紅色矩形
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLx8CXyEjNwkDMwIzLcNXZnFWbJlnc05WRvwFe4lHalNWasF2LcRXZu9lbkN3Yfd2bsJ2Xw9CXzV2Zh1WavwFdl5mLuR2cj5yZvxmYtA3Lc9CX6MHc0RHaiojIsJye.jpg)
關閉混合時 打開混合時 疊加時顔色
結果:
1、背景色也參與混合過程;
2、利用綠色背景測試可得,RGBA中的A值對單一顔色顯示沒有效果,但混合和
透明是依靠A值計算的;
3、當輸入顔色值為RGB時,混合計算時,A值預設為0.0。