OpenGL中的混合 (blend)

來源:互聯網
上載者:User

    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)

綠色背景,紅色矩形

         

       關閉混合時                        開啟混合時            疊加時顏色

 

結果:

1、背景色也參與混合過程;

2、利用綠色背景測試可得,RGBA中的A值對單一顏色顯示沒有效果,但混合和

透明是依靠A值計算的;

3、當輸入顏色值為RGB時,混合計算時,A值預設為0.0。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.