OpenGL中的混合測試

  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。

發佈了54 篇原創文章 · 獲贊 13 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章