周謙 倪健
在人機交互的界面軟件中經(jīng)常要使用各類圖形,如點、直線、曲線、多邊形和圓,軟件設(shè)計人員通過編寫程序?qū)D形按需要的方式呈現(xiàn)給使用者。所有圖形最終是以像素為基本單位顯示到屏幕,當一條直線,不在水平或垂直方向時,放大它的顯示結(jié)果,可以觀察到直線呈現(xiàn)鋸齒狀,效果看起來不自然。本文結(jié)合實際的軟件開發(fā)過程,探討使用Opengl反走樣優(yōu)化圖形的顯示方法。
Opengl(Open Graphics Library)實際上是一套標準的圖形與硬件之間的開放圖形庫接口,為軟件開發(fā)者提供了豐富的圖形編程接口(API),支持不同的編程語言和硬件平臺。軟件接口由幾百個不同的函數(shù)組成,可實現(xiàn)從簡單的圖形繪制到復雜的三維圖形交互。OpenGL常應(yīng)用于虛擬儀表設(shè)備、計算機輔助設(shè)計、可視化程序和游戲等軟件的開發(fā)。其中反走樣函數(shù)功能可以很好地解決圖形鋸齒化的問題。
軟件背景
為了設(shè)計具有360°指向的顯示圖,選用Opengl作為圖形設(shè)計的接口。在只通過360條線段連接組成的多邊形,近似地表現(xiàn)圓的外形圖,編碼完成的效果如圖1所示。
通過放大截圖,可以觀察到圓形的邊緣明細呈現(xiàn)鋸齒狀,特別是在接近垂直和水平時,更是明顯。如圖2和圖3所示。
解決思路
所有計算機顯示的圖形都是是由離散的像素點組成的,因此屏幕上的圖像與現(xiàn)實事物存在一些誤差。誤差主要表現(xiàn)為圖形上的直線或光滑曲線的邊緣呈現(xiàn)鋸齒狀、彩色的顏色失真、微小物體的不細致體現(xiàn)等。其中的邊緣鋸齒化就叫做走樣。解決這種圖形顯示與設(shè)計者預期效果不同的走樣問題,有2個處理思路。
其一:提高分辨率
分辨率是指屏幕在橫向上的點數(shù)乘以縱向上的點數(shù),得到總的像素點數(shù)。在同樣大小的屏幕上,當分辨率低時,在屏幕上顯示的像素就少,像素與像素之間的距離(像距)較大,單個像素的尺寸也較大。當分辨率提高時,在屏幕上顯示的像素增多,像素與像素之間的距離(像距)變小,單個像素尺寸也變小。通過提升硬件處理能力,增加單位面積內(nèi)的像素數(shù)量。在屏幕尺寸不變的情況下,分辨率越高,縮小像素之間的距離,顯示效果就越精準、細膩,可取得接近現(xiàn)實世界的效果。但這種方法的缺點是成本會大幅提高,并且會引起掃描轉(zhuǎn)換時間變長、幀緩存容量變大等系列問題。
其二:軟件反走樣
反走樣(Antialiasing),是計算機圖形學中的一個重要概念。反走樣就是將圖形邊緣與其相鄰的像素點的顏色進行混合,讓過渡變得平緩柔和,圖像就顯得更順滑。如圖4所示,左部是走樣線,右部是反走樣線。
比較2種解決問題的思路,第2種更簡潔、經(jīng)濟和可行。
代碼實現(xiàn)
Opengl為軟件開發(fā)人員提供了完善的反走樣函數(shù)。
首先調(diào)用glEnable (GL_BLEND)函數(shù)啟用融合,之后啟用點、線、多邊形的反走樣。
glEnable( GL_POINT_SMOOTH );
glEnable( GL_LINE_SMOOTH );
glEnable( GL_POLYGON_SMOOTH )。
可以調(diào)用函數(shù)glHint()對圖像質(zhì)量與制圖速度之間的作些調(diào)整,但并非所有的編碼都采用它,依據(jù)實際情況而定。其函數(shù)形式為:glHint( GLenum target , GLenum hint ),參數(shù)取值范圍見表1所示。
實際效果
經(jīng)過反走樣處理后的圓形邊緣鋸齒淡化了,即使放大觀察,也依然平滑,曲線的過度更柔和。
在觀察Opengl反走樣處理的圖形邊緣效果后,可看出其圖形整體的視覺效果更細膩、更自然,軟件使用者的感受會更加舒適。