混合
當(dāng)開啟深度測試后,兩個(gè)重疊的圖層中,如果有一個(gè)圖層是半透明的,另一個(gè)是非半透明,此時(shí)就不能通過深度值比較,來進(jìn)行顏色值的覆蓋,而是需要將兩個(gè)顏色進(jìn)行混合,然后存入顏色緩沖區(qū)。
顏色混合的使用方式
1.用于單純的將兩個(gè)圖層重疊時(shí)進(jìn)行顏色混合,這種混合并不能解決顏色的混合。在固定著色器和可編程著色器都可以使用這種方式
//開啟,
glEnable(GL_BlEND);
//關(guān)閉
glDisable(GL_BlEND);
2.用于處理類似濾鏡效果的場景,簡單描述就是將需要處理的圖片顏色和圖片上覆蓋的半透明顏色進(jìn)行混合 即 兩股顏色混合,此時(shí)如果只是單純的開關(guān)方式,已經(jīng)不能滿足我們的需求,需要借助混合方程式,來實(shí)現(xiàn)兩股顏色的混合。一般是在可編程著色器中片元著色器中使用。
//開啟,
glEnable(GL_BlEND);
//設(shè)置混合因子--默認(rèn)值是 GL_SRC_ALPHA 和 GL_ONE_MINUS_SRC_ALPHA
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//關(guān)閉
glDisable(GL_BlEND);

- 設(shè)置混合因子--默認(rèn)值是 GL_SRC_ALPHA 和GL_ONE_MINUS_SRC_ALPHA
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- 混合因子計(jì)算方程式 :
//Cf -- 最終組合的顏色值
//Cd:源顏色 -- 當(dāng)前渲染命令傳入的顏色值
//CS:目標(biāo)顏色 -- 顏色緩沖區(qū)中已經(jīng)存在的顏色值
//S:源混合因子
//D:目標(biāo)混合因子
Cf = (Cs * S) + (Cd * D)

表中R、G、B、A 分別代表 紅、綠、藍(lán)、alpha。
表中下標(biāo)S、D,分別代表源、?標(biāo)
表中C 代表常量顏?(默認(rèn)??)

通過glbBlendEquation(GLenum mode)修改顏色的混合方程式
通過一個(gè)常見的混合函數(shù)組合來說明問題:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
通過上面的調(diào)用來告訴OpenGL我們使用的混合因子。
假設(shè)現(xiàn)在渲染命令傳進(jìn)來的源RGBA顏色值是(1.0f,0.0f,1.0f,1.0f)。而在顏色緩沖區(qū)相同的位置已經(jīng)有目標(biāo)顏色RGBA值是(0.0f, 1.0f, 0.0f, 1.0f)。
代入公式:Ci = (Cs * S) + (Cd * D)
Cs(目標(biāo)顏色)=(1.0f,0.0f,1.0f,0.6f), GL_SRC_ALPHA參數(shù)說明源混合因子取源顏色的alpha值,所以S = 0.6f。
Cd(源顏色)=(0.0f, 1.0f, 0.0f, 1.0f). GL_ONE_MINUS_SRC_ALPHA說明了目標(biāo)混合因子取1-As,D = 1-0.6 = 0.4f;
所以代入計(jì)算得:
(Cs * S) = (0.6f, 0.0f, 0.6f, 0.36f)
(Cd * D) = (0.0f, 0.4f, 0.0f, 0.4f)
Ci = (Cs * S) + (Cd * D) = (0.6f, 0.4f, 0.6f, 0.76f)
得到的顏色是近似于洋紫色。
最終顏色是以目標(biāo)顏?與源顏色進(jìn)行組合。源顏色的alpha值越高,添加的源顏色成分越高,目標(biāo)顏?所保留的成分就會越少。 混合函數(shù)經(jīng)常用于實(shí)現(xiàn)在其他?些不透明的物體前?繪制一個(gè)透明物體的效果。
混合總結(jié)點(diǎn):
- 在顏色緩沖區(qū)中,每個(gè)像素點(diǎn)只能存儲一種顏色
- 顏色混合主要用于實(shí)現(xiàn)在不透明物體前繪制透明物體的效果
- 只有上面圖層是透明時(shí),才需要開啟顏色混合,如果不是,則沒有必要開啟顏色混合