Pangolin中opengl的混合(gl_blend)

Blend 混合是將源色和目標色以某種方式混合生成特效的技術。混合經常使用來繪製透明或半透明的物體。在混合中起關鍵做用的α值其實是將源色和目標色按給定比率進行混合,以達到不一樣程度的透明。α值爲0則徹底透明,α值爲1則徹底不透明。混合操做只能在RGBA模式下進行,顏色索引模式下沒法指定α值。物體的繪製順序會影響到OpenGL的混合處理。算法

 

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

相關文章
相關標籤/搜索