OpenGL的混合

混合指的是對源顏色(RGBA)和目標顏色的處理獲得新的顏色的過程。函數

那什麼叫源顏色呢?圖片

好比你要繪製一張圖片,那麼圖片上的顏色就能夠稱爲源顏色。io

因爲在繪製的時候,在幀緩衝區實際上已經有以前繪製的顏色了,這就稱爲目標顏色。參數

那麼就要對這2種顏色進行混合處理。顏色

開啓和關閉混合的方式以下:ab

glEnable( GL_BLEND );// 啓用混合
glDisable( GL_BLEND );// 禁用關閉混合

混合的公式以下:

設:某個源顏色爲       (Rs, Gs, Bs, As)
       目的顏色爲           (Rd, Gd, Bd, Ad)
       源混合因子爲:    (Sr, Sg, Sb, Sa)
       目的混合因子爲: (Dr, Dg, Db, Da)
那麼,最終目標顏色爲:
(Rs*Sr <op> Rd*Dr,  Gs*Sg <op> Gd*Dg,  Bs*Sb <op> Bd*Db,  As*Sa <op> Ad*Da)
其中,<op>能夠是加法(+),減法(-), 逆向減法,最小值,最大值或按位邏輯操做,而且其優先級小於乘法(*)。默認的操做是相加。能夠經過glBlendEquation來指定操做方式

使用混合的時候,咱們一般只須要指定混合因子:

glBlendFunc( GLenum sfactor , GLenum dfactor );// 混合函數

其中sfactor表示源因子,dfactor表示目標因子。

混合因子有以下可選參數:

one                                        1
zero                                       0
SrcColor                               源的RGB值,例如(0.5,0.4,1)
SrcAlpha                               源的A值, 例如0.6
DstColor                               混合目標的RGB值例如(0.5,0.4,1)
DstAlpha                               混合目標的A值例如0.6
OneMinusSrcColor             (1,1,1) - SrcColor
OneMinusSrcAlpha             1- SrcAlpha
OneMinusDstColor             (1,1,1) - DstColor
OneMinusDstAlpha             1- DstAlpha

舉例:

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.7 , 0.8*0.8
結果爲 0.8 , 0.72 , 0.56 , 0.64


目標色爲 ( 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

在這個例子中,代表源顏色佔80%,目標顏色佔20%。

而後咱們使用glBlendEquation()來指定混合操做,參數能夠是: GL_FUNC_ADD(加), GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN, GL_MAX。

相關文章
相關標籤/搜索