周謙 倪健
在人機交互的界面軟件中經常要使用各類圖形,如點、直線、曲線、多邊形和圓,軟件設計人員通過編寫程序將圖形按需要的方式呈現給使用者。所有圖形最終是以像素為基本單位顯示到屏幕,當一條直線,不在水平或垂直方向時,放大它的顯示結果,可以觀察到直線呈現鋸齒狀,效果看起來不自然。本文結合實際的軟件開發過程,探討使用Opengl反走樣優化圖形的顯示方法。
Opengl(Open Graphics Library)實際上是一套標準的圖形與硬件之間的開放圖形庫接口,為軟件開發者提供了豐富的圖形編程接口(API),支持不同的編程語言和硬件平臺。軟件接口由幾百個不同的函數組成,可實現從簡單的圖形繪制到復雜的三維圖形交互。OpenGL常應用于虛擬儀表設備、計算機輔助設計、可視化程序和游戲等軟件的開發。其中反走樣函數功能可以很好地解決圖形鋸齒化的問題。
軟件背景
為了設計具有360°指向的顯示圖,選用Opengl作為圖形設計的接口。在只通過360條線段連接組成的多邊形,近似地表現圓的外形圖,編碼完成的效果如圖1所示。

通過放大截圖,可以觀察到圓形的邊緣明細呈現鋸齒狀,特別是在接近垂直和水平時,更是明顯。如圖2和圖3所示。

解決思路
所有計算機顯示的圖形都是是由離散的像素點組成的,因此屏幕上的圖像與現實事物存在一些誤差。誤差主要表現為圖形上的直線或光滑曲線的邊緣呈現鋸齒狀、彩色的顏色失真、微小物體的不細致體現等。其中的邊緣鋸齒化就叫做走樣。解決這種圖形顯示與設計者預期效果不同的走樣問題,有2個處理思路。
其一:提高分辨率
分辨率是指屏幕在橫向上的點數乘以縱向上的點數,得到總的像素點數。在同樣大小的屏幕上,當分辨率低時,在屏幕上顯示的像素就少,像素與像素之間的距離(像距)較大,單個像素的尺寸也較大。當分辨率提高時,在屏幕上顯示的像素增多,像素與像素之間的距離(像距)變小,單個像素尺寸也變小。通過提升硬件處理能力,增加單位面積內的像素數量。在屏幕尺寸不變的情況下,分辨率越高,縮小像素之間的距離,顯示效果就越精準、細膩,可取得接近現實世界的效果。但這種方法的缺點是成本會大幅提高,并且會引起掃描轉換時間變長、幀緩存容量變大等系列問題。
其二:軟件反走樣
反走樣(Antialiasing),是計算機圖形學中的一個重要概念。反走樣就是將圖形邊緣與其相鄰的像素點的顏色進行混合,讓過渡變得平緩柔和,圖像就顯得更順滑。如圖4所示,左部是走樣線,右部是反走樣線。

比較2種解決問題的思路,第2種更簡潔、經濟和可行。
代碼實現
Opengl為軟件開發人員提供了完善的反走樣函數。
首先調用glEnable (GL_BLEND)函數啟用融合,之后啟用點、線、多邊形的反走樣。
glEnable( GL_POINT_SMOOTH );
glEnable( GL_LINE_SMOOTH );
glEnable( GL_POLYGON_SMOOTH )。
可以調用函數glHint()對圖像質量與制圖速度之間的作些調整,但并非所有的編碼都采用它,依據實際情況而定。其函數形式為:glHint( GLenum target , GLenum hint ),參數取值范圍見表1所示。

實際效果
經過反走樣處理后的圓形邊緣鋸齒淡化了,即使放大觀察,也依然平滑,曲線的過度更柔和。


在觀察Opengl反走樣處理的圖形邊緣效果后,可看出其圖形整體的視覺效果更細膩、更自然,軟件使用者的感受會更加舒適。