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