原因
顏色緩沖區存儲著像素點的顏色信息,當深度緩沖區開啟時,當該像素點深度小于原來的深度時的顏色信息就會被替換為新的顏色信息。當我們的顏色攜帶透明度信息時,就需要用到混合。
混合顏色
目標顏色
已經存儲在顏色緩存區的顏色值
源顏色
作為當前渲染命令結果進入顏色緩存區的顏色值
當混合功能被啟動時,源顏色和?標顏色的組合方式是混合方程式控制的。在默認情況下,混合?方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf :最終計算參數的顏色
Cs : 源顏色
Cd :目標顏色
S:源混合因子
D:?標混合因子
使用
開啟混合
glEnable(GL_BlEND)
設置混合因子
glBlendFunc(GLenum S,GLenum D)
S:源混合因?子
D:?目標混合因?子
混合因子如下圖:
模擬案例
下?通過一個常見的混合函數組合來說明問題:
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)
更改組合方式
選擇混合?程式的函數:
glbBlendEquation(GLenum mode)
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
值允許混合方程式中引入一個常量混合顏色。
常量混合顏色,默認初始化為?色(0.0f,0.0f,0.0f,0.0f)
修改常量混合顏色
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha )