2013.04.29 14:55

顯示卡 4 大反鋸齒技術探討:鋸齒的產生與消除,前處理、後處理之爭

ADVERTISEMENT

提高取樣數解決影像鋸齒

難道說在螢幕自身解析度的限制下,我們就沒有辦法透過提高對3D模型的取樣數,達到反鋸齒的效果嗎?非也,其實我們還是可以提高取樣的數量,只要在輸出圖像之前降低解析度,一樣以達到反鋸齒的功效。

SSAA是反鋸齒基本

SSAA(Super Sample Anti-Aliasing,超級採樣反鋸齒)是對抗鋸齒最有效的方法之一,它的概念相當簡單,SSAA技術是以高於最終輸出值的解析度進行3D模型取樣與渲染,並且在輸出前對畫面進行降頻處理(Downsampling),將鄰近的像素的色彩取平均值,並產生1個新的像素,最終就可以產生較為平滑的畫像。

SSAA好處是原理非常單純,而且整個畫面都會經過反鋸齒處理,所以得到的畫像品質是所有方式中效果最好的。不過它的缺點也很顯而易見,在使用SSAA時,需要繪製更高解析度圖像,並且負擔降頻工作,所以SSAA對效能的耗損也是數一數二的嚴重。

ADVERTISEMENT

▲提高解析度固然能降低圖像失真的程度,但是螢幕的解析度是有限的,所以我們需要換個方式來解決鋸齒問題,將多個取樣加總後取平均值,就是SSAA的基本概念。

取樣方式影響效果

在SSAA運作的過程中,程式會對取樣點(Sampling point)所在位置進行取樣,以確定依照取樣點排列方式的不同,可以分為循序排列(Ordered Grid)、旋轉排列(Rotated Grid)與隨機排列(Random Grid)等類別。

ADVERTISEMENT

循序排列與旋轉排列是比較常見的取樣方式,取樣點都是以正方型方式排列,不同的是在旋轉排列中,每組取樣點都會旋轉特定角度。兩者之間並沒有絕對的優劣,但是由於像素本身就是以水平、垂直的方向排列,因此在這2個方向並不會產生鋸齒問題,然而旋轉排列能夠更精準地取樣這2個方向以外物件,因此在大部分實際情況中表現比較出色。

隨機排列的原理則比較特別,由於人眼對於固定模式形狀的辨識能力大於雜訊,採用隨機排列的方式進行取樣,就是把鋸齒隱藏在白色雜訊(White noise,意即將鋸齒變成均勻雜訊,並且平均分部在整個畫面中)中,讓人眼不容易辨識,但是每個像素通常需要16個或更多的取樣數才能獲得足夠的雜訊量,所以實用價值並不高。

ADVERTISEMENT

▲對於對角線方向的物件邊緣來說,旋轉排列能夠有效率地利用取樣點,所以通常能比循續排列得到更好的反鋸齒效果。

白色雜訊 (White noise)

與白色雜訊相對的雜訊為有色雜訊,兩者的差別在於白色雜訊中各頻段的訊號強度皆相同,而有色雜訊則是各頻段訊號強度不盡相同。其「白色」稱呼的由來取自於白光,白光是由各種顏色的單色光混合而成,而白色雜訊則是由各種頻段的雜訊組合而成。

與白色雜訊相對的雜訊為有色雜訊,兩者的差別在於白色雜訊中各頻段的訊號強度皆相同,而有色雜訊則是各頻段訊號強度不盡相同。其「白色」稱呼的由來取自於白光,白光是由各種顏色的單色光混合而成,而白色雜訊則是由各種頻段的雜訊組合而成。

OGSSAA把圖像放大再縮小

為了閱讀的方便,筆者分別以OGSSAA與RGSSAA稱呼以循序排列、旋轉排列方式取樣的SSAA。OGSSAA的實作相對來說簡單許多,它只要將3D模型依比例放大,並渲染成解析度較高的圖像儲存於緩衝區中,並將此圖像降頻處理再輸出即可。

以套用2x OGSSAA於1920 x 1080解析度的遊戲為例,在3D模型繪圖完成後,程式會將模型投影於Z緩衝(Z buffer)/模板緩衝(Stencil buffer)的座標放大2倍,進行解析度為3840 x 2160的取樣,並且進行渲染成平面圖像,接著再將鄰近的4個像素的色彩取平均值,產生1個新的像素,最終就可以產生較為平滑,解析度為1920 x 1080的遊戲畫面。

ADVERTISEMENT

▲OGSSAA的概念為繪製高解析度的圖像,再經由降頻處理消除畫面中的鋸齒。

Z緩衝(Z buffer)

由於一般的3D繪圖都是以三角型的多邊型(Polygon)做為繪圖基本元素,在渲染的過程中,處理單元會1個接著1個地渲染多邊型,但是它並不知道這些多邊型會不會被其他物件遮住,而不顯示在最終畫面上,所以我們需要能夠辨識景深的方法。

Z緩衝法是常用的方式之一,在渲染的過程中,Z緩衝會計算繪製出的每個像素與攝影機的距離(即Z值),並與儲存於緩衝區內的數值相比,如果計算出的距離比緩衝區內的數值遠,代表這個像素會被前方物體遮蔽,所以不會顯示於最終畫面。反之,如果數值比較近,就代表該像素會被看到,所以需要顯示於最終畫面。由於程式可以從Z緩衝中得知各多邊型的資訊,因此可以用來推算多邊型的邊緣。

RGSSAA需要渲染多張圖像

RGSSAA的取樣方式不會移動取樣點,而是透過移動圖片本身來達成,在3D模型繪製完成後,程式會將模型以小於像素的幅度「抖動」,如此一來就可以套用相對移動的概念,在不移動取樣點的方式,達到移動取樣點的效果。舉個例子來說,將3D模型往左上抖動,就可以取得右下位置的取樣點。

若是採用2x RGSSAA,在3D模型繪圖完成後,程式會以小於像素寬度的尺度微幅抖動模型,並分別渲染4張不同1920 x 1080的平面圖像,在降頻的過程中,只需把4張圖像對應位置的像素的色彩取平均值,就可以輸出經反鋸齒處理的平滑圖像。

▲RGSSAA則是繪製多張不同的圖像,以堆疊的方式取得經反鋸齒處理的3D畫面。


MSAA偷吃步賺效能

雖然SSAA能夠得到很好的反鋸齒效果,但是由於顯示卡需要負擔數倍於無反鋸齒圖像的運算量,所以不一定能夠讓遊戲流暢地執行,MSAA(Muitl-Sample Anti-Aliasing)就是為了解決這個問題而生。

由於鋸齒只會產生於非透明多邊型的邊緣部分,所以對於多邊型內部的像素進行反鋸齒處理,其實是種浪費效能的行為,MSAA在運作的過程中會分析與Z緩衝/模板緩衝中的資料,辨別前景多邊型的邊緣所在,並針對邊緣進行與反鋸齒處理。由於多邊型內部以及被遮蔽的部分不再需要進行多次取樣及運算,因此可以降低運算需求,提高效能表現。

早期的MSAA並不會檢查多邊型的透明度,以至於在透明、半透明物件後方的物件不會被施以反鋸齒處理,常見的例子如鐵絲網或是玻璃窗後方的物件。為了要解決這個問題,AMD 與NVIDIA分別推出Adaptive Anti-Aliasing與Transparency Anti-Aliasing,其最主要的差別在於這2種技術會檢查材質的透明度,若該材質為透明或半透明,那其後方物件也會進行反鋸齒處理,以改善MSAA的缺點。

(後面還有:跳過渲染階段效能更高)

ADVERTISEMENT