OpenGL(七)- 渲染技巧:顏色混合
我們都知道顏色緩存區(qū)和深度緩沖區(qū)原理一致奋构,在同一個(gè)位置上只能保存一個(gè)值耿导。那么我們常見的透明圖層相互之間的影響又是為什么呢?
-
首先通過之前的知識(shí)來接單解讀一下兩個(gè)不透明的圖層相互重疊時(shí)系統(tǒng)做了什么舱呻?
-
如果其中一塊為50%透明
如果這種情況出現(xiàn)箱吕,我們依舊是進(jìn)行深度測試芥驳,丟棄藍(lán)色部分就不合理了〔绺撸現(xiàn)在要做的就是需要將兩個(gè)顏色進(jìn)行混合
才為更為合理,但計(jì)算機(jī)并沒有那么智能需要開發(fā)者來進(jìn)行混合后顏色的計(jì)算怎栽。
當(dāng)然OpenGL也考慮到了這一點(diǎn):
void RenderScene(void){
//1.清空顏色緩存區(qū)
glClear(GL_COLOR_BUFFER_BIT)
//2.開啟混合
glEnable(GL_BLEND);
//3.指定組合函數(shù),有系統(tǒng)來計(jì)算混合結(jié)果
glBlandFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//4.指定混合方程函數(shù)熏瞄,一般不需要設(shè)置
glBlendEquation(GL_FUNC_ADD);
//4.關(guān)閉
glDisable(GL_BLAND);
}
glBlendEquation(GLenum mode)
一般不需要設(shè)置,系統(tǒng)默認(rèn)使用 GL_FUNC_ADD
glBlandFunc(GLenum sfactor, GLenum dfactor)
其他API相信已經(jīng)見過很多次了强饮,只有glBlandFunc
以及參數(shù)
需要解釋一下。
API中進(jìn)行計(jì)算時(shí)根據(jù)公式:
Cf = (Cs * S) + (Cd * D)
Cf表示: 計(jì)算后的最終顏色
Cs表示: 源顏色邮丰,也就是渲染命令中后傳入的顏色
S表示: 源混合因子
Cd表示: 目標(biāo)顏色,也就是已經(jīng)保存在顏色混合區(qū)中的顏色剪廉。要注意這個(gè)位置的顏色和圖層的前后并無關(guān)系。之和渲染的先后有關(guān)斗蒋。
D表示: 目標(biāo)混合因子
-
對應(yīng)上方公式開發(fā)者能操作的其實(shí)只有S捧书、D這兩個(gè)混合因子骤星,下圖是API中兩個(gè)參數(shù)的參數(shù)表。
R洞难、G、B队贱、A表示: 紅、綠柱嫌、藍(lán)、透明度
S编丘、D表示: 源、目標(biāo)
C 代表常量(一般為黑色)
幾種參數(shù)嘗試
//使用默認(rèn)參數(shù)的情況
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//使用其他參數(shù)的情況
glBlendFunc(GL_CONSTANT_ALPHA, GL_CONSTANT_ALPHA);
情況很多就不一一實(shí)驗(yàn)嘉抓,一般使用的默認(rèn)值
glBlandFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
枚舉值套入公式
使用默認(rèn)參數(shù),舉例:
源顏色(CS)為: (1.0f晕窑,0.5f,0.0f, 0.6f)
目標(biāo)顏色(CD)為:(0f抑片,1.0f,0.5f, 1.0f)
S(源因子)為: 0.6f
D(目標(biāo)因子)為: 1-0.6f(源透明度) = 0.4f
結(jié)果 = (源顏色 * 0.6f) + (目標(biāo)顏色 * 0.4f)
- 通過計(jì)算可知:
- 源因子的Alpha越大杨赤,則目標(biāo)顏色保留成分越少
- 若果源因子的Alpha為1,則目標(biāo)顏色設(shè)置無效疾牲,也就是被覆蓋。開啟混合后這種情況依舊會(huì)進(jìn)行混合計(jì)算说敏。所以顏色混合一般用在:一個(gè)半透明/不透明的物體前面繪制一個(gè)半透明的物體。