本文講解的是OpenGL中實(shí)現(xiàn)抗鋸齒的兩種方式,一種是顏色混合,一種是多重采樣,這兩種方式各有優(yōu)劣。
為什么會(huì)產(chǎn)生鋸齒?
OpenGL中,像素點(diǎn)是正方形的,在兩個(gè)正方形之間,會(huì)有顏色的分界。會(huì)給人一種不逼真的感覺(jué)。為了抗鋸齒,OpenGL給了兩種方案來(lái)實(shí)現(xiàn)
顏色混合
組合顏色的概念:
目標(biāo)顏色:已經(jīng)存儲(chǔ)在顏色緩沖區(qū)的顏色值
遠(yuǎn)顏色:作為當(dāng)前渲染命令結(jié)果進(jìn)入顏色緩沖區(qū)的顏色值
當(dāng)混合功能被啟動(dòng)時(shí),源顏色和目標(biāo)顏色的組合方式時(shí)混合方程式控制的,在默認(rèn)情況下,混合方程式如下:
Cf = (CsS)+(CdD);
Cf:最終計(jì)算參數(shù)的顏色
Cs:源顏色
Cd:目標(biāo)顏色
S :源顏色混合因子
D :目標(biāo)顏色混合因子
設(shè)置混合因子
設(shè)置混合因子,需要用到glBlendFunc函數(shù),兩個(gè)參數(shù)根據(jù)項(xiàng)目產(chǎn)品的需求來(lái)定,并且已經(jīng)有了一張混合因子枚舉列表,如下圖所示,混合因子不光有顏色的混合,還有透明度因子的混合

我們通過(guò)一個(gè)常見(jiàn)的混合函數(shù)組合來(lái)說(shuō)明問(wèn)題:
glBlendFunc(GL_SRC_ALPHA,GLONE_MINUS_ALPHA);
S = GL_SRC_ALPHA:RGB混合因子(As,As,As),Alpha混合因子As
D = G_LONE_MINUS_ALPHA混合因子 1-(As,As,As),Alpha = 1-As;
Cf = (CsS)+(CdD)
那么我們?nèi)绾稳ビ?jì)算呢?
如果顏色緩沖區(qū),已經(jīng)有一種紅色 (1.0f,0.0f,0.0f,0.0f),如果在上面用一種藍(lán)色(0.0f,0.0f,1.0f,0.6f)
Color = (R,G,B,A);
Cd(目標(biāo)顏色) = (1.0f,0.0f,0.0f,0.0f);
Cs(源顏色) = (0.0f,0.0f,1.0f,0.6f);
S(RGB) = (As,As,As),S(Alpha) = As
D(RGB) = 1- (As,As,As),D(Alpha) = 1-As
S(r) = 0.6f,S(g) = 0.6f, S(b) = 0.6f,S(a) = 0.6f;
D(r) = 1-As = 0.4f,同理D(g) = 0.4f,D(b) =0.4f,D(a) = 0.4f;
因此可得:Cf = (Cs*S)+(Cd*D)
Cf(Red) = (0.0f*0.6)+(1.0*0.4) = 0.4f
Cf(Green) = (0.0*0.6f)+(0.0*0.4) = 0.0f
Cf(Blue) = (1.0*0.6)+(0.0*0.4) = 0.6f
Cf(Alpha) = (0.6*0.6)+(0.0*0.4) = 0.36f;
Cf = (0.4f,0.0f,0.6f,0.36f);
最終顏色是以原先的紅色(目標(biāo)顏色)與后來(lái)的藍(lán)色(源顏色)進(jìn)行組合,源顏色的alpha值越高,添加藍(lán)色的成分越高,目標(biāo)顏色所保留的成分越少
混合函數(shù)通常用于實(shí)現(xiàn)在其他一些不透明的物體前面繪制一個(gè)透明物體的效果
顏色混合抗鋸齒
OpenGL將兩個(gè)顏色的交界處進(jìn)行混合來(lái)實(shí)現(xiàn)平滑過(guò)渡
glEnable(Gl_BLEND);//開(kāi)啟混合處理
glBlendFunc(GL_SRC_ALPHA,GLONE_MINUS_ALPHA);//指定混合因子(只能是)
glBlendEquation(GL_FUNC_ADD);//指定混合方程式(只能是)
glEnable(GL_POINT_SMOOTH)//對(duì)點(diǎn)進(jìn)行抗鋸齒處理
glEnable(GL_LINE_SMOOTH)//對(duì)線進(jìn)行抗鋸齒處理
glEnable(GL_POLYGON_SMOOTH);//對(duì)多邊形進(jìn)行抗鋸齒處理
多重采樣抗鋸齒
有些平臺(tái)是沒(méi)有辦法幫助你完成混合抗鋸齒的,因?yàn)榛旌系牡讓臃浅5膹?fù)雜,那么這時(shí)候我們就要用到多重采樣了
OpenGL中有個(gè)緩沖區(qū)叫多重采樣緩沖區(qū),會(huì)對(duì)我們的圖元的每一個(gè)像素進(jìn)行多次采樣然后存儲(chǔ)到我們的緩沖區(qū)中,幸運(yùn)的是這個(gè)過(guò)程是自動(dòng)的,不需要我們開(kāi)發(fā)者去關(guān)心,屬于幕后發(fā)生的事情,所以我們也沒(méi)辦法去解釋這個(gè)實(shí)現(xiàn)的過(guò)程。
雖然多重采樣會(huì)造成額外的資源開(kāi)銷,但是以目前的設(shè)備性能,我們幾乎可以忽略不計(jì)。
如何使用多重采樣呢?
//1.調(diào)用glutInitDisplayMode 添加采樣緩沖區(qū)
glutInitDisplayMode(GLUT_MULTSAMPLE);
//2.打開(kāi)|關(guān)閉
glEnable(GLUT_MULTSAMPLE);
glDisable(GLUT_MULTSAMPLE);
需要注意的是當(dāng)你開(kāi)啟多重采樣來(lái)進(jìn)行抗鋸齒時(shí),顏色混合會(huì)失效
因此我們需要在合適的地方開(kāi)啟多重采樣,那么如果你只是對(duì)點(diǎn)、線進(jìn)行抗鋸齒,那么顏色混合效果更佳(前提是平臺(tái)支持),多邊形采用多重采樣
在使用顏色混合前,為了避免之前用過(guò)多重采樣,最好先關(guān)閉,然后在使用顏色混合之后再在需要的時(shí)候開(kāi)啟
拓展
多重采樣緩沖區(qū)在默認(rèn)情況下使用片段RGB值,并不包含顏色的Alpha成分,我們可以通過(guò)glEnable來(lái)修改這個(gè)行為:
*GL_SAMPLE_ALPHA_TO_COVERAGE使用alpha值
*GL_SAMPLE_ALPHA_TO_ON使用alpha值并設(shè)置為1
*GL_SAMPLE_COVERAGE 使用glSampleCoverage所設(shè)置的值
當(dāng)啟用GL_SAMPLE_COVERAGE時(shí),可以使用glSampleCoverage函數(shù)指定一個(gè)特定的值,它是與片段覆蓋值進(jìn)行按位與操作的結(jié)果。