于曉明,孔耀美
(陜西科技大學(xué) 電氣與信息工程學(xué)院,陜西 西安 710021)
基于OpenGL的反走樣算法的分析與應(yīng)用
于曉明,孔耀美
(陜西科技大學(xué) 電氣與信息工程學(xué)院,陜西 西安 710021)
計(jì)算機(jī)圖形光柵化的過(guò)程中不可避免出現(xiàn)走樣的現(xiàn)象。為了減輕圖像的走樣現(xiàn)象,需要在光柵化之后對(duì)圖像進(jìn)行反走樣處理。當(dāng)前各種反走樣算法不足在于圖形的階梯狀鋸齒較為明顯。通過(guò)分析幾種反走樣算法的原理,比較不同反走樣算法的優(yōu)缺點(diǎn),結(jié)合當(dāng)前的圖形處理器,探討利用OpenGL圖形庫(kù)在VC++環(huán)境下基于混合反走樣技術(shù),對(duì)不同的圖元進(jìn)行反走樣的操作,相對(duì)避免了現(xiàn)有方法所具有的局限性,具有非??斓乃俣群头浅3錾囊曈X(jué)質(zhì)量,有效解決走樣問(wèn)題。
反走樣算法;真實(shí)度;OpenGL
在計(jì)算機(jī)圖形學(xué)中,一個(gè)很重要的問(wèn)題就是圖形的真實(shí)感問(wèn)題。由于計(jì)算機(jī)是以離散的點(diǎn)生成圖形的,則生成的圖形必然與真實(shí)的景物存在差異。
針對(duì)圖形圖像走樣問(wèn)題通常采用硬件技術(shù)和軟件技術(shù)兩種方法處理。硬件技術(shù)采用增加顯示設(shè)備分辨率實(shí)現(xiàn)圖形反走樣,成本高,環(huán)境要求嚴(yán)格。國(guó)內(nèi)外軟件反走樣技術(shù)有反鋸齒Wu算法[1]、紋理映射中Mip-maping算法[2]、Bresenham算法[3]、DDA算法[4]、Wu&Rokne雙步算法[5]、Kuzmin單點(diǎn)生成算法[6]等。Bresenham算法是比較流行的直線光柵化算法,該算法具有效率高、易于硬件實(shí)現(xiàn)的優(yōu)點(diǎn),不足在于圖形的階梯狀鋸齒較為明顯,給人的感覺(jué)不舒服。
本文分析比較了直線距離加權(quán)反走樣算法、區(qū)域采樣算法、加權(quán)區(qū)域反走樣算法以及離散區(qū)域反走樣算法,結(jié)合當(dāng)前的圖形處理器,探討利用OpenGL圖形庫(kù)在VC++環(huán)境下基于混合反走樣技術(shù),相對(duì)的避免了上述方法所具有的局限性,具有非??斓乃俣群头浅3錾囊曈X(jué)質(zhì)量,有效解決走樣問(wèn)題。
線段和多邊形的邊線經(jīng)過(guò)光柵化處理后看起來(lái)呈鋸齒狀。在理想狀態(tài)下表示的線段是連續(xù)的對(duì)象,當(dāng)把連續(xù)的線段表示成具有有限分辨率的采樣對(duì)象時(shí),出現(xiàn)的這種誤差稱(chēng)之為走樣現(xiàn)象。用直線方程及坐標(biāo)進(jìn)行表示可以清楚地看到兩者的坐標(biāo)點(diǎn)之間的差異。
假設(shè)要繪制的理想的直線方程為:y=0.375*x+ 0.625 x∈[0,9]
那么像素直線方程為:
int對(duì)括號(hào)值四舍五入后取整數(shù),得的坐標(biāo)值如表1所示。
表1 理想直線與像素直線的坐標(biāo)對(duì)比
圖1 走樣產(chǎn)生原因的圖解分析
圖1展示了理想直線與像素表示的直線的對(duì)比情況。這一段直線在直角坐標(biāo)系中繪制出來(lái)能夠更明顯地表現(xiàn)出走樣產(chǎn)生的原因,其中陰影部分為顯示直線的像素點(diǎn)。
反走樣(anti-aliasing)是用于減輕各種走樣現(xiàn)象的技術(shù)。對(duì)于光柵掃描器來(lái)說(shuō)走樣現(xiàn)象不可避免,只能減輕。
2.1反走樣算法
反走樣技術(shù)可以分為兩類(lèi):一類(lèi)是硬件技術(shù),通過(guò)提高顯示器的分辨率來(lái)實(shí)現(xiàn);另一類(lèi)是軟件技術(shù),通過(guò)改進(jìn)軟件算法來(lái)實(shí)現(xiàn)。
軟件技術(shù)的實(shí)質(zhì)是利用人眼視覺(jué)原理,使用加權(quán)參數(shù)調(diào)節(jié)像素的灰度級(jí)別,以產(chǎn)生模糊的邊界,從而達(dá)到減弱階梯效應(yīng)的視覺(jué)效果。加權(quán)參數(shù)可以選擇距離、面積和體積等。根據(jù)加權(quán)參數(shù)的不同,反走樣算法可以被分為直線距離加權(quán)反走樣、區(qū)域采樣算法、加權(quán)區(qū)域反走樣算法以及離散區(qū)域反走樣算法。
2.1.1直線距離加權(quán)反走樣
直線距離加權(quán)反走樣算法的原理是根據(jù)像素和理想直線的距離對(duì)像素的灰度級(jí)別進(jìn)行調(diào)節(jié)。兩個(gè)灰度不同的像素來(lái)表示理想直線上的一個(gè)點(diǎn),達(dá)到在視覺(jué)上消除階梯的效果。實(shí)際應(yīng)用中,用兩個(gè)像素寬度表示的反走樣直線,在視覺(jué)效果上寬度會(huì)有所減小,看起來(lái)像是一個(gè)像素寬度的直線[7]。
以一條簡(jiǎn)單的直線A(x0,y0),B(x1,y1)為例,它的斜率為k。圖2中AB所表示的直線為理想直線,而P1至P6是直線所經(jīng)過(guò)的像素點(diǎn)。
圖2 光柵化繪制直線結(jié)果(未反走樣)
根據(jù)Bresenham算法原理,由于斜率0≤k≤1,所以沿x方向移位,那么直線掃描以后P4,P2,P3被點(diǎn)亮,造成階梯走樣。
接下來(lái)就要通過(guò)直線距離加權(quán)反走樣的算法對(duì)其光柵化的結(jié)果進(jìn)行反走樣的處理。直線距離加權(quán)反走樣是以理想直線上的點(diǎn)與當(dāng)前上下兩像素點(diǎn)之間的距離為權(quán)值,用該權(quán)值乘以直線的灰度值,作為上下兩像素各自的灰度值,用兩個(gè)像素點(diǎn)來(lái)表示直線上的一點(diǎn)。這樣,距離理想直線遠(yuǎn)的像素點(diǎn)灰度值較大,反之則較小。以此達(dá)到減輕邊緣鋸齒的目的[8]。
由此,根據(jù)該算法,可以對(duì)圖2進(jìn)行反走樣處理,得到的結(jié)果如圖3所示。由圖3可知上下兩個(gè)像素以不同的灰度級(jí)別共同顯示,像素點(diǎn)離直線越近,其灰度值越小,像素越暗;反之像素越亮。二者的灰度級(jí)別之和等于1。
2.1.2區(qū)域采樣算法
區(qū)域采樣算法是將每個(gè)像素看作一個(gè)具有一定面積的小區(qū)域,將直線段看作是具有一定寬度的狹長(zhǎng)矩形。當(dāng)矩形(即直線段)與像素相交時(shí),求出兩者相交區(qū)域的面積,然后根據(jù)相交區(qū)域面積的大小確定該像素的亮度值[9]。
圖3 直線距離加權(quán)反走樣效果圖
所以區(qū)域采樣算法首先要計(jì)算相交區(qū)域的面積,在像素格上畫(huà)一條直線寬度為1,斜率為m的直線,那么像素格與直線(0≤m≤1)的相交情況如圖4所示,其中D為三角形在y方向上的邊長(zhǎng)。
圖4 像素格與直線相交區(qū)域面積
直線與像素格的相交區(qū)域是一個(gè)介于0和1之間的實(shí)數(shù)。用這個(gè)實(shí)數(shù)乘以像素的亮度值,就可以得到該像素實(shí)際顯示的亮度值。圖5是通過(guò)區(qū)域采樣反走樣后的直線的著色圖。
圖5 區(qū)域采樣算法反走樣效果圖
2.1.3加權(quán)區(qū)域反走樣算法
(1)算法分析。為了使靠近理想直線的像素分配到更大的亮度值,可以采用圓錐形濾波器。
建立一個(gè)底圓半徑為一個(gè)像素單位,高為1的圓錐,并使底圓中心位于當(dāng)前像素中心。當(dāng)直線經(jīng)過(guò)該像素時(shí),該像素的亮度值等于在相交區(qū)域上對(duì)濾波器進(jìn)行積分的積分值。相交區(qū)域即為直線條與圓錐底面的相交區(qū)域。那么在幾何上這個(gè)積分的結(jié)果相當(dāng)于垂直于直線兩邊沿的平面,與圓錐相割所得的三維物體的體積[10]。
當(dāng)直線經(jīng)過(guò)該像素時(shí),該像素的亮度F是兩者在相交區(qū)域A上對(duì)濾波器(函數(shù)w)進(jìn)行積分的積分值。
(2)算法特點(diǎn)。加權(quán)區(qū)域反走樣的算法特點(diǎn)是接近理想直線的像素將被分配更多的灰度值。并且相鄰兩個(gè)像素的濾波器相交,有利于縮小直線條上的像素的灰度差。
2.1.4離散區(qū)域反走樣算法
離散區(qū)域反走樣算法的基本原理是,將屏幕的一個(gè)物理像素均分成n個(gè)子像素。對(duì)于每個(gè)物理像素,計(jì)算其子像素的中心點(diǎn)落在直線段內(nèi)的個(gè)數(shù)m。則該像素的權(quán)值I為m/n。
在下圖6中可以看到每個(gè)物理像素被虛線分成了9個(gè)子像素,黑點(diǎn)為每個(gè)子像素的中心點(diǎn),當(dāng)一條寬為1的直線經(jīng)過(guò)左下角的這個(gè)像素時(shí),有5個(gè)子像素的中心點(diǎn)落在了直線范圍內(nèi),則上述公式中,I=5/9。
圖6 離散區(qū)域加權(quán)反走樣原理
對(duì)于彩色圖像的情況,反走樣圖形的光強(qiáng)還需要考慮背景色。
2.2反走樣算法分析
以上介紹了圖形學(xué)中的4種反走樣算法,都支持對(duì)點(diǎn)和直線的平滑處理。它們通過(guò)不同的方法對(duì)圖形邊緣進(jìn)行反走樣處理。
直線距離加權(quán)反走樣算法是以直線與像素的距離進(jìn)行像素的亮度分配。算法簡(jiǎn)單易懂但是精確度不高。
區(qū)域采樣算法是以直線占像素點(diǎn)的面積為權(quán)值,對(duì)像素點(diǎn)進(jìn)行亮度分配。這種算法實(shí)現(xiàn)的反走樣圖形更加的細(xì)膩逼真。
離散區(qū)域反走樣算法與區(qū)域反走樣算法原理相同,只是在面積的計(jì)算方面進(jìn)行簡(jiǎn)化。計(jì)算量少,但是在渲染效果方面要差一些。
加權(quán)區(qū)域反走樣算法是對(duì)像素切割濾波器的立體區(qū)域進(jìn)行積分,有利于縮小相鄰像素的灰度差,反走樣效果好。但是計(jì)算量大,花費(fèi)時(shí)間長(zhǎng)。綜上所述,從反走樣效果和計(jì)算量的角度考慮,在同等條件下,區(qū)域采樣算法是比較優(yōu)良的算法。
3.1OpenGL中反走樣的原理
為了消除圖元之間的鋸齒狀邊緣,OpenGL使用混合功能來(lái)混合片段的顏色,也就是把像素的目標(biāo)顏色與周?chē)袼氐念伾M(jìn)行混合。
首先,必須啟用混合功能,并且設(shè)置混合函數(shù):
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
在混合函數(shù)glBlendFunc()中,函數(shù)參數(shù)的設(shè)置決定了源混合因子S和目標(biāo)混合因子D的設(shè)置方式,Cd(Rd,Gd,Bd,Ad)、Cs(Rs,Gs,Bs,As)、Cf分別為混合顏色中的目標(biāo)顏色、源顏色和混合顏色。當(dāng)混合被啟用時(shí),源顏色和目標(biāo)顏色的組合方式是由混合方程控制的。默認(rèn)情況下為:Cf=(Cs×S)+(Cd×D)[11]。
混合因子的設(shè)置就是通過(guò)函數(shù) glBlend-Func(GLenum S,Glenum D)設(shè)置的[12]。
下面用一個(gè)常用的混合函數(shù)來(lái)舉例說(shuō)明:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MIUS_SRC_ALPHA)
如果顏色緩沖區(qū)已經(jīng)有一個(gè)紅色(1.0f,0.0f,0.0f,0.0f),這是目標(biāo)顏色Cd。如果在這上面用一種alpha值為0.6的藍(lán)色(0.0f,0.0f,1.0f,0.6f)(源顏色Cs)畫(huà)了一些圖形。應(yīng)用上面這個(gè)函數(shù),就可以像下面這樣計(jì)算得到最終的顏色。
S=(As,As,As,As)=(0.6,0.6,0.6,0.6)
D=((1-As),(1-As),(1-As),(1-As))=(0.4,0.4,0.4,0.4)
Cf=(Cs×S)+(Cd×D)=((1.0f,0.0f,0.0f,0.0f)×(0.6,0.6,0.6,0.6))+((0.0f,0.0f,1.0f,0.6f)×(0.4,0.4,0.4,0.4))
在啟用混合功能并且設(shè)置了混合函數(shù)以后,可以選擇調(diào)用glEnable()函數(shù)對(duì)點(diǎn)、直線、和多邊形進(jìn)行抗鋸齒處理[13]:
glEnable(GL_POINT_SMOOTH);//對(duì)點(diǎn)進(jìn)行平滑處理
glEnable(GL_LINE_SMOOTH);//對(duì)直線進(jìn)行平滑處理
glEnable(GL_POLYGON_SMOOTH);//對(duì)多邊形邊緣進(jìn)行平滑處理
接下來(lái)對(duì)混合的速度或者質(zhì)量進(jìn)行選擇,用函數(shù)glHint(Glenum target,Glenum mode),它可以對(duì)點(diǎn)、線、多邊形的采樣質(zhì)量進(jìn)行偏重質(zhì)量或者速度的選擇。
3.2OpenGL反走樣示例
接下來(lái)可以通過(guò)繪制一個(gè)簡(jiǎn)單的點(diǎn)、線、多邊形來(lái)驗(yàn)證OpenGL中反走樣的效果,反走樣的代碼片段如下所示:
glEnable(GL_BLEND);//開(kāi)啟混合
glEnable(GL_POINT_SMOOTH);//點(diǎn)反走樣
glEnable(GL_LINE_SMOOTH);//線段反走樣
glEnable(GL_POLYGON_SMOOTH);//多邊形反走樣
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT,GL_NICST);//點(diǎn)和多邊形同理
glPushMatrix();//繪制圖像部分代碼
glLineWidth(2);
glTranslatef(350.0,200.0,0.0);
glRotatef(5.0,0.0,0.0,1.0);
glBegin(GL_POLYGON);
glVertex2f(0.0,0.0);
glVertex2f(0.0,200.0);
glVertex2f(200.0,200.0);
glVertex2f(200.0,0.0);
glEnd();
glPopMatrix();
glLoadIdentity();
運(yùn)行結(jié)果如圖7所示。運(yùn)行后沒(méi)有反走樣和經(jīng)過(guò)反走樣的圖像的部分放大對(duì)比圖如圖8所示。
由圖8可以看出,經(jīng)過(guò)反走樣以后,通過(guò)不同灰度值來(lái)表示圖形的邊界能夠在視覺(jué)上達(dá)到更加平滑的效果,以達(dá)到圖像真實(shí)化細(xì)膩化的目的。
圖7 圖形反走樣運(yùn)行效果圖
圖8 未反走樣與反走樣放大對(duì)比圖
OpenGL的混合反走樣原理是基于區(qū)域采樣算法的。OpenGL語(yǔ)句對(duì)算法進(jìn)行了封裝,成為一種與平臺(tái)無(wú)關(guān)的圖形API。它的優(yōu)點(diǎn)是具有高度可移植性,并且具有非常快的速度和非常出色的視覺(jué)質(zhì)量。然而區(qū)域采樣算法是有一定缺點(diǎn)的,首先像素的亮度與相交區(qū)域的面積成正比,而與相交區(qū)域落在像素內(nèi)的位置無(wú)關(guān)。這在某種程度上仍然會(huì)導(dǎo)致階梯現(xiàn)象。其次直線條上沿理想直線方向的相鄰兩個(gè)像素有時(shí)會(huì)有較大的亮度差,特別是直線是一條接近水平或者接近垂直的直線時(shí),這種現(xiàn)象會(huì)比較突出。所以選擇更精確的算法可以使OpenGL語(yǔ)句具有更好的渲染效果。
反走樣技術(shù)是實(shí)現(xiàn)計(jì)算機(jī)圖形真實(shí)化的一項(xiàng)關(guān)鍵的技術(shù)。本文主要研究了計(jì)算機(jī)圖形學(xué)中幾種反走樣算法的原理,并且在VC++環(huán)境下,通過(guò)OpenGL語(yǔ)句實(shí)現(xiàn)圖形的反走樣,對(duì)系統(tǒng)地掌握反走樣算法原理以及OpenGL反走樣技術(shù)具有一定的意義。
[1]WU X L.An efficient antialiasing technique[J].Computer Graphics,1991,25(4):143-152.
[2]LUO X A,WANG R M.Computer graphics[M].Guangzhou:Sun Yat-sen University Press,1996,61-81.
[3]BRESENHAM J E.A linear algorithm for incremental digital display of circular arcs[J].Communications of the ACM,1977,20(2):100-106.
[4]李震霄,何援軍.任意寬度直線的繪制與反走樣[J].武漢大學(xué)學(xué)報(bào)(工學(xué)版),2006,39(4):130-133.
[5]SHEN H,ZHANG X,HU S J.A double-step circle drawing algorithm[J].Journal of Shengyang University of Technology,2002,24(6):514-516.
[6]KUZMIN Y P.An efficient circle-drawing algorithm[J].Computer Graphics Forum,1990,9(4):333-336.
[7]馬培華.直線反走樣生成和裁剪的算法改進(jìn)研究[D].南寧:廣西大學(xué),2012.
[8]駱朝亮.一種支持多線寬直線反走樣算法[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010,20(9):102-105.
[9]孔令德.基于面積加權(quán)反走樣算法的研究[J].工程圖學(xué)學(xué)報(bào),2009(4):49-54.
[10]沈強(qiáng),張波,陳淑珍.計(jì)算機(jī)圖形學(xué)反走樣技術(shù)及實(shí)現(xiàn)[J].武漢大學(xué)學(xué)報(bào)(自然科學(xué)版),1997(1):114-119.
[11]DAVE SHREINER.OpenGL編程指南[M].北京:機(jī)械工業(yè)出版社,2010.
[12]RICHARD S W,BENJAMIN L,NICHOLAS H.OpenGL超級(jí)寶典[M].4版.北京:人民郵電出版社,2010.
[13]趙方,張軍和,彭亞雄.基于OpenGL紋理映射反走樣技術(shù)的研究[J].人工智能及識(shí)別技術(shù),2011,7(17):4160-4161.
Analysis andApplication ofAnti-aliasingAlgorithms Based on OpenGL
YU Xiaoming,KONG Yaomei
(College of Electrical and Information Engineering,Shaanxi University of Science&Technology,Xi’an 710021,Shaanxi,China)
Aliasing phenomenon is unavoidable during the process of computer graphics rasterization.In order to increase the quality of displayed image,it is necessary to anti-alias after the rasterization.Currently,the disadvantage of existing anti-aliasing technology is mainly the graphics ladder serrate problem.This paper analyzes several kinds of anti-aliasing algorithms,compares them by all advantages and disadvantages and combines algorithms with current graphics processor to explore the use of OpenGL in VC++environment based on mixed anti-aliasing technology.This paper also operates anti-aliasing process among different primitives,which relatively avoids the limitation of existing method,guarantees extreme speed and high visual quality and for most,solves the aliasing problem effectively.
anti-aliasing algorithms;true extent;OpenGL
TP391.41
A
1672-2914(2016)02-0060-05
2015-12-06
咸陽(yáng)市科技局科研項(xiàng)目(513134)。
于曉明(1965—),女,陜西白水縣人,陜西科技大學(xué)電氣與信息工程學(xué)院副教授,工學(xué)博士,研究方向?yàn)橛?jì)算機(jī)應(yīng)用。
咸陽(yáng)師范學(xué)院學(xué)報(bào)2016年2期