我們把OpenGL?渲染時(shí)會(huì)把顏?色值存在顏?緩存區(qū)中,每個(gè)片段的深度值也是放在深度緩沖區(qū)。當(dāng)深度 緩沖區(qū)被關(guān)閉時(shí),新的顏?將簡單的覆蓋原來顏色緩存區(qū)存在的顏?值,當(dāng)深度緩沖區(qū)再次打開時(shí),新的顏色?段只是當(dāng)它們比原來的值更更接近鄰近的裁剪平面才會(huì)替換原來的顏色片段。
開啟混合:glEnable(GL_BlEND);
1、結(jié)算方式
組合顏色目標(biāo)顏色:已經(jīng)存儲(chǔ)在顏色緩存區(qū)的顏?色值
源顏色:作為當(dāng)前渲染命令結(jié)果進(jìn)?入顏色緩存區(qū)的顏?色值 ,當(dāng)混合功能被啟動(dòng)時(shí),源顏?和目標(biāo)顏色的組合方式是混合方程式控制的。在默認(rèn)情況下,
? ? ? ?默認(rèn)混合方程式如下所示:
????????????????Cf = (Cs * S) + (Cd * D)
????????????????Cf?:最終計(jì)算參數(shù)的顏色????Cs?: 源顏色
????????????????Cd?:目標(biāo)顏色S:源混合因子????D:目標(biāo)混合因?
實(shí)際上遠(yuǎn)不止這?種混合?程式,我們可以從5個(gè)不同的方程式中進(jìn)行選擇。
選擇混合方程式的函數(shù):
????????glbBlendEquation(GLenum mode);
2、 設(shè)置混合因子,需要用到glBlendFun函數(shù)
????????glBlendFunc(GLenum S,GLenum D);?
????????S:源混合因?
????????D:目標(biāo)混合因?
????????表中R、G、B、A?分別代表 紅、綠、藍(lán)、alpha。 表中下標(biāo)S、D,分別代表源、目標(biāo)
表中,C?代表常量顏色(默認(rèn)?色)
3、下面通過?個(gè)常見的混合函數(shù)組合來說明問題:
????????glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
????????如果顏?緩存區(qū)已經(jīng)有一種顏?紅色(1.0f,0.0f,0.0f,0.0f),這個(gè)?標(biāo)顏?Cd,如果在這上面?一 種alpha為0.6的藍(lán)色(0.0f,0.0f,1.0f,0.6f)
????????Cd (目標(biāo)顏色) =?(1.0f,0.0f,0.0f,0.0f);?
????????Cs (源顏色) =?(0.0f,0.0f,1.0f,0.6f);
????????S =?源alpha值?= 0.6f
????????D = 1 - 源alpha值= 1-0.6f = 0.4f
?????????程式Cf = (Cs * S) + (Cd * D)
????????等價(jià)于?=?(Blue * 0.6f)?+ (Red * 0.4f)
4、
最終顏色是以原先的紅色(?標(biāo)顏?)與 后來的藍(lán)色(源顏?)進(jìn)行組合。源顏色的alpha值 越高,添加的藍(lán)?色顏?成分越高,?標(biāo)顏?所保留的成分就會(huì)越少。 混合函數(shù)經(jīng)常用于實(shí)現(xiàn)在其他?些不透明的物體前?繪制一個(gè)透明物體的效果。
5、glBlendFuncSeparate?函數(shù)
除了了能使用glBlendFunc?來設(shè)置混合因子,還可以有更靈活的選擇。
????????void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
????????strRGB:?源顏色的混合因?
????????dstRGB:??標(biāo)顏色的混合因?
????????strAlpha:?源顏色的Alpha因?
????????dstAlpha:??標(biāo)顏色的Alpha因?
注意:
????????glBlendFunc?指定源和?標(biāo)RGBA值的混合函數(shù);但是glBlendFuncSeparate函數(shù)則允許為RGB?和Alpha?成分單獨(dú)指定混合函數(shù)。
????????在混合因子表中,GL_CONSTANT_COLOR,GL_ONE_MINUS_CONSTANT_COLOR,GL_CONSTANT_ALPHA,
GL_ONE_MINUS_CONSTANT值允許混合方程式中引?一個(gè)常量混合顏色。
6、常量混合顏?
常量混合顏色,默認(rèn)初始化為?色(0.0f,0.0f,0.0f,0.0f),但是還是可以修改這個(gè)常量混合顏色。
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha );