于曉明,孔耀美
(陜西科技大學(xué) 電氣與信息工程學(xué)院,陜西 西安 710021)
基于OpenGL的反走樣算法的分析與應(yīng)用
于曉明,孔耀美
(陜西科技大學(xué) 電氣與信息工程學(xué)院,陜西 西安 710021)
計算機圖形光柵化的過程中不可避免出現(xiàn)走樣的現(xiàn)象。為了減輕圖像的走樣現(xiàn)象,需要在光柵化之后對圖像進行反走樣處理。當(dāng)前各種反走樣算法不足在于圖形的階梯狀鋸齒較為明顯。通過分析幾種反走樣算法的原理,比較不同反走樣算法的優(yōu)缺點,結(jié)合當(dāng)前的圖形處理器,探討利用OpenGL圖形庫在VC++環(huán)境下基于混合反走樣技術(shù),對不同的圖元進行反走樣的操作,相對避免了現(xiàn)有方法所具有的局限性,具有非??斓乃俣群头浅3錾囊曈X質(zhì)量,有效解決走樣問題。
反走樣算法;真實度;OpenGL
在計算機圖形學(xué)中,一個很重要的問題就是圖形的真實感問題。由于計算機是以離散的點生成圖形的,則生成的圖形必然與真實的景物存在差異。
針對圖形圖像走樣問題通常采用硬件技術(shù)和軟件技術(shù)兩種方法處理。硬件技術(shù)采用增加顯示設(shè)備分辨率實現(xiàn)圖形反走樣,成本高,環(huán)境要求嚴(yán)格。國內(nèi)外軟件反走樣技術(shù)有反鋸齒Wu算法[1]、紋理映射中Mip-maping算法[2]、Bresenham算法[3]、DDA算法[4]、Wu&Rokne雙步算法[5]、Kuzmin單點生成算法[6]等。Bresenham算法是比較流行的直線光柵化算法,該算法具有效率高、易于硬件實現(xiàn)的優(yōu)點,不足在于圖形的階梯狀鋸齒較為明顯,給人的感覺不舒服。
本文分析比較了直線距離加權(quán)反走樣算法、區(qū)域采樣算法、加權(quán)區(qū)域反走樣算法以及離散區(qū)域反走樣算法,結(jié)合當(dāng)前的圖形處理器,探討利用OpenGL圖形庫在VC++環(huán)境下基于混合反走樣技術(shù),相對的避免了上述方法所具有的局限性,具有非??斓乃俣群头浅3錾囊曈X質(zhì)量,有效解決走樣問題。
線段和多邊形的邊線經(jīng)過光柵化處理后看起來呈鋸齒狀。在理想狀態(tài)下表示的線段是連續(xù)的對象,當(dāng)把連續(xù)的線段表示成具有有限分辨率的采樣對象時,出現(xiàn)的這種誤差稱之為走樣現(xiàn)象。用直線方程及坐標(biāo)進行表示可以清楚地看到兩者的坐標(biāo)點之間的差異。
假設(shè)要繪制的理想的直線方程為:y=0.375*x+ 0.625 x∈[0,9]
那么像素直線方程為:
int對括號值四舍五入后取整數(shù),得的坐標(biāo)值如表1所示。
表1 理想直線與像素直線的坐標(biāo)對比
圖1 走樣產(chǎn)生原因的圖解分析
圖1展示了理想直線與像素表示的直線的對比情況。這一段直線在直角坐標(biāo)系中繪制出來能夠更明顯地表現(xiàn)出走樣產(chǎn)生的原因,其中陰影部分為顯示直線的像素點。
反走樣(anti-aliasing)是用于減輕各種走樣現(xiàn)象的技術(shù)。對于光柵掃描器來說走樣現(xiàn)象不可避免,只能減輕。
2.1反走樣算法
反走樣技術(shù)可以分為兩類:一類是硬件技術(shù),通過提高顯示器的分辨率來實現(xiàn);另一類是軟件技術(shù),通過改進軟件算法來實現(xiàn)。
軟件技術(shù)的實質(zhì)是利用人眼視覺原理,使用加權(quán)參數(shù)調(diào)節(jié)像素的灰度級別,以產(chǎn)生模糊的邊界,從而達到減弱階梯效應(yīng)的視覺效果。加權(quán)參數(shù)可以選擇距離、面積和體積等。根據(jù)加權(quán)參數(shù)的不同,反走樣算法可以被分為直線距離加權(quán)反走樣、區(qū)域采樣算法、加權(quán)區(qū)域反走樣算法以及離散區(qū)域反走樣算法。
2.1.1直線距離加權(quán)反走樣
直線距離加權(quán)反走樣算法的原理是根據(jù)像素和理想直線的距離對像素的灰度級別進行調(diào)節(jié)。兩個灰度不同的像素來表示理想直線上的一個點,達到在視覺上消除階梯的效果。實際應(yīng)用中,用兩個像素寬度表示的反走樣直線,在視覺效果上寬度會有所減小,看起來像是一個像素寬度的直線[7]。
以一條簡單的直線A(x0,y0),B(x1,y1)為例,它的斜率為k。圖2中AB所表示的直線為理想直線,而P1至P6是直線所經(jīng)過的像素點。
圖2 光柵化繪制直線結(jié)果(未反走樣)
根據(jù)Bresenham算法原理,由于斜率0≤k≤1,所以沿x方向移位,那么直線掃描以后P4,P2,P3被點亮,造成階梯走樣。
接下來就要通過直線距離加權(quán)反走樣的算法對其光柵化的結(jié)果進行反走樣的處理。直線距離加權(quán)反走樣是以理想直線上的點與當(dāng)前上下兩像素點之間的距離為權(quán)值,用該權(quán)值乘以直線的灰度值,作為上下兩像素各自的灰度值,用兩個像素點來表示直線上的一點。這樣,距離理想直線遠的像素點灰度值較大,反之則較小。以此達到減輕邊緣鋸齒的目的[8]。
由此,根據(jù)該算法,可以對圖2進行反走樣處理,得到的結(jié)果如圖3所示。由圖3可知上下兩個像素以不同的灰度級別共同顯示,像素點離直線越近,其灰度值越小,像素越暗;反之像素越亮。二者的灰度級別之和等于1。
2.1.2區(qū)域采樣算法
區(qū)域采樣算法是將每個像素看作一個具有一定面積的小區(qū)域,將直線段看作是具有一定寬度的狹長矩形。當(dāng)矩形(即直線段)與像素相交時,求出兩者相交區(qū)域的面積,然后根據(jù)相交區(qū)域面積的大小確定該像素的亮度值[9]。
圖3 直線距離加權(quán)反走樣效果圖
所以區(qū)域采樣算法首先要計算相交區(qū)域的面積,在像素格上畫一條直線寬度為1,斜率為m的直線,那么像素格與直線(0≤m≤1)的相交情況如圖4所示,其中D為三角形在y方向上的邊長。
圖4 像素格與直線相交區(qū)域面積
直線與像素格的相交區(qū)域是一個介于0和1之間的實數(shù)。用這個實數(shù)乘以像素的亮度值,就可以得到該像素實際顯示的亮度值。圖5是通過區(qū)域采樣反走樣后的直線的著色圖。
圖5 區(qū)域采樣算法反走樣效果圖
2.1.3加權(quán)區(qū)域反走樣算法
(1)算法分析。為了使靠近理想直線的像素分配到更大的亮度值,可以采用圓錐形濾波器。
建立一個底圓半徑為一個像素單位,高為1的圓錐,并使底圓中心位于當(dāng)前像素中心。當(dāng)直線經(jīng)過該像素時,該像素的亮度值等于在相交區(qū)域上對濾波器進行積分的積分值。相交區(qū)域即為直線條與圓錐底面的相交區(qū)域。那么在幾何上這個積分的結(jié)果相當(dāng)于垂直于直線兩邊沿的平面,與圓錐相割所得的三維物體的體積[10]。
當(dāng)直線經(jīng)過該像素時,該像素的亮度F是兩者在相交區(qū)域A上對濾波器(函數(shù)w)進行積分的積分值。
(2)算法特點。加權(quán)區(qū)域反走樣的算法特點是接近理想直線的像素將被分配更多的灰度值。并且相鄰兩個像素的濾波器相交,有利于縮小直線條上的像素的灰度差。
2.1.4離散區(qū)域反走樣算法
離散區(qū)域反走樣算法的基本原理是,將屏幕的一個物理像素均分成n個子像素。對于每個物理像素,計算其子像素的中心點落在直線段內(nèi)的個數(shù)m。則該像素的權(quán)值I為m/n。
在下圖6中可以看到每個物理像素被虛線分成了9個子像素,黑點為每個子像素的中心點,當(dāng)一條寬為1的直線經(jīng)過左下角的這個像素時,有5個子像素的中心點落在了直線范圍內(nèi),則上述公式中,I=5/9。
圖6 離散區(qū)域加權(quán)反走樣原理
對于彩色圖像的情況,反走樣圖形的光強還需要考慮背景色。
2.2反走樣算法分析
以上介紹了圖形學(xué)中的4種反走樣算法,都支持對點和直線的平滑處理。它們通過不同的方法對圖形邊緣進行反走樣處理。
直線距離加權(quán)反走樣算法是以直線與像素的距離進行像素的亮度分配。算法簡單易懂但是精確度不高。
區(qū)域采樣算法是以直線占像素點的面積為權(quán)值,對像素點進行亮度分配。這種算法實現(xiàn)的反走樣圖形更加的細膩逼真。
離散區(qū)域反走樣算法與區(qū)域反走樣算法原理相同,只是在面積的計算方面進行簡化。計算量少,但是在渲染效果方面要差一些。
加權(quán)區(qū)域反走樣算法是對像素切割濾波器的立體區(qū)域進行積分,有利于縮小相鄰像素的灰度差,反走樣效果好。但是計算量大,花費時間長。綜上所述,從反走樣效果和計算量的角度考慮,在同等條件下,區(qū)域采樣算法是比較優(yōu)良的算法。
3.1OpenGL中反走樣的原理
為了消除圖元之間的鋸齒狀邊緣,OpenGL使用混合功能來混合片段的顏色,也就是把像素的目標(biāo)顏色與周圍像素的顏色進行混合。
首先,必須啟用混合功能,并且設(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)混合被啟用時,源顏色和目標(biāo)顏色的組合方式是由混合方程控制的。默認情況下為:Cf=(Cs×S)+(Cd×D)[11]。
混合因子的設(shè)置就是通過函數(shù) glBlend-Func(GLenum S,Glenum D)設(shè)置的[12]。
下面用一個常用的混合函數(shù)來舉例說明:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MIUS_SRC_ALPHA)
如果顏色緩沖區(qū)已經(jīng)有一個紅色(1.0f,0.0f,0.0f,0.0f),這是目標(biāo)顏色Cd。如果在這上面用一種alpha值為0.6的藍色(0.0f,0.0f,1.0f,0.6f)(源顏色Cs)畫了一些圖形。應(yīng)用上面這個函數(shù),就可以像下面這樣計算得到最終的顏色。
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ù)對點、直線、和多邊形進行抗鋸齒處理[13]:
glEnable(GL_POINT_SMOOTH);//對點進行平滑處理
glEnable(GL_LINE_SMOOTH);//對直線進行平滑處理
glEnable(GL_POLYGON_SMOOTH);//對多邊形邊緣進行平滑處理
接下來對混合的速度或者質(zhì)量進行選擇,用函數(shù)glHint(Glenum target,Glenum mode),它可以對點、線、多邊形的采樣質(zhì)量進行偏重質(zhì)量或者速度的選擇。
3.2OpenGL反走樣示例
接下來可以通過繪制一個簡單的點、線、多邊形來驗證OpenGL中反走樣的效果,反走樣的代碼片段如下所示:
glEnable(GL_BLEND);//開啟混合
glEnable(GL_POINT_SMOOTH);//點反走樣
glEnable(GL_LINE_SMOOTH);//線段反走樣
glEnable(GL_POLYGON_SMOOTH);//多邊形反走樣
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT,GL_NICST);//點和多邊形同理
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();
運行結(jié)果如圖7所示。運行后沒有反走樣和經(jīng)過反走樣的圖像的部分放大對比圖如圖8所示。
由圖8可以看出,經(jīng)過反走樣以后,通過不同灰度值來表示圖形的邊界能夠在視覺上達到更加平滑的效果,以達到圖像真實化細膩化的目的。
圖7 圖形反走樣運行效果圖
圖8 未反走樣與反走樣放大對比圖
OpenGL的混合反走樣原理是基于區(qū)域采樣算法的。OpenGL語句對算法進行了封裝,成為一種與平臺無關(guān)的圖形API。它的優(yōu)點是具有高度可移植性,并且具有非??斓乃俣群头浅3錾囊曈X質(zhì)量。然而區(qū)域采樣算法是有一定缺點的,首先像素的亮度與相交區(qū)域的面積成正比,而與相交區(qū)域落在像素內(nèi)的位置無關(guān)。這在某種程度上仍然會導(dǎo)致階梯現(xiàn)象。其次直線條上沿理想直線方向的相鄰兩個像素有時會有較大的亮度差,特別是直線是一條接近水平或者接近垂直的直線時,這種現(xiàn)象會比較突出。所以選擇更精確的算法可以使OpenGL語句具有更好的渲染效果。
反走樣技術(shù)是實現(xiàn)計算機圖形真實化的一項關(guān)鍵的技術(shù)。本文主要研究了計算機圖形學(xué)中幾種反走樣算法的原理,并且在VC++環(huán)境下,通過OpenGL語句實現(xiàn)圖形的反走樣,對系統(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é)報(工學(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]馬培華.直線反走樣生成和裁剪的算法改進研究[D].南寧:廣西大學(xué),2012.
[8]駱朝亮.一種支持多線寬直線反走樣算法[J].計算機技術(shù)與發(fā)展,2010,20(9):102-105.
[9]孔令德.基于面積加權(quán)反走樣算法的研究[J].工程圖學(xué)學(xué)報,2009(4):49-54.
[10]沈強,張波,陳淑珍.計算機圖形學(xué)反走樣技術(shù)及實現(xiàn)[J].武漢大學(xué)學(xué)報(自然科學(xué)版),1997(1):114-119.
[11]DAVE SHREINER.OpenGL編程指南[M].北京:機械工業(yè)出版社,2010.
[12]RICHARD S W,BENJAMIN L,NICHOLAS H.OpenGL超級寶典[M].4版.北京:人民郵電出版社,2010.
[13]趙方,張軍和,彭亞雄.基于OpenGL紋理映射反走樣技術(shù)的研究[J].人工智能及識別技術(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
咸陽市科技局科研項目(513134)。
于曉明(1965—),女,陜西白水縣人,陜西科技大學(xué)電氣與信息工程學(xué)院副教授,工學(xué)博士,研究方向為計算機應(yīng)用。