混合指的是對源顏色(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。