glEnable( GL_BLEND ); // 啓用混合緩存
glDisable( GL_BLEND ); // 禁用關閉混合函數
得到混合的信息測試
glGet( GL_BLEND_SRC );優化
glGet( GL_BLEND_DST );spa
glIsEnable( GL_BLEND );.net
glBlendFunc( GLenum sfactor , GLenum dfactor ); // 混合函數blog
sfactor 源混合因子索引
dfactor 目標混合因子ci
混合因子枚舉
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 場景中使用混合和深度檢測
一、使用深度檢測
二、繪製不透明的物體
三、設只讀 深度檢測
四、繪製半透明的物體
五、設 讀/寫 深度檢測
如下對混合算法進行測試,統一使用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)
綠色背景,紅色矩形
關閉混合時 打開混合時 疊加時顏色
結果:
一、背景色也參與混合過程;
二、利用綠色背景測試可得,RGBA中的A值對單一顏色顯示沒有效果,但混合和
透明是依靠A值計算的;
三、當輸入顏色值爲RGB時,混合計算時,A值默認爲0.0。
參考博文:http://blog.csdn.net/hudfang/article/details/46726465