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

ADVERTISEMENT

提高取樣數解決影像鋸齒

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

SSAA是反鋸齒基本

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

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

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

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

取樣方式影響效果

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

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

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

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

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

白色雜訊 (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的遊戲畫面。

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

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

Z緩衝(Z buffer)

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

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

RGSSAA需要渲染多張圖像

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

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

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

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

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

MSAA偷吃步賺效能

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

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

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

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

國寶大師 李文恩
作者

電腦王特約作者,專門負責硬派內容,從處理器、主機板到開發板、零組件,尖端科技都一手包辦,最近的研究計畫則包括Windows 98復活與AI圖像生成。

使用 Facebook 留言
司馬雲
1人給推

1.  司馬雲 (發表於 2013年4月29日 15:47)
第一個取樣說明跟本是亂寫
跟據fourier transform
所有的波型都可以分解為sin跟cos的組合
再跟據nyquist法則,取樣頻率只要大於該波型的兩倍就可以做到無失真的取樣
所以只要取樣頻率是原始訊號的兩倍,跟本就沒有失真的問題

如果是照你第一個說明,是不是一個sin(t)的弦波也要無限多個取樣點才能做到無失真取樣?
100000198803735
1人給推

2.  100000198803735 (發表於 2013年4月29日 17:23)
fourier transform跟取樣定理的確告訴你
只要你的取樣頻率比你的待測頻率高兩倍就可以作到無失真的取樣沒錯
不過那是理論
前提是你取樣的點都剛好在波峰跟波谷
所以實際面上來說
你要得到任一相位差的弦波
你的確是需要無限多的取樣點才能完全無失真
所以他第一個說法上是沒錯的
國寶大師 李文恩
2人給推

3.  國寶大師 李文恩 (發表於 2013年4月29日 17:46)
※ 引述《司馬雲》的留言:
> 第一個取樣說明跟本是亂寫

請注意文章的內容,該圖形為一「任意曲線」
請問要如何定義一任意曲線的頻率?

然而永遠有比「你說的頻率」大的頻率存在(你說100,我就說101,你再說101,我就說102......以此類推),所以此任意曲線的取樣頻率是可以推到無限大的。
司馬雲
1人給推

5.  司馬雲 (發表於 2013年4月29日 19:15)
※ 引述《國寶大師 李文恩》的留言:
> ※ 引述《司馬雲》的留言:
> > 第一個取樣說明跟本是亂寫
>
> 請注意文章的內容,該圖形為一「任意曲線」
> 請問要如何定義一任意曲線的頻率?
>
> 然而永遠有比「你說的頻率」大的頻率存在(你說100,我就說101,你再說101,我就說102......以此類推),所以此任意曲線的取樣頻率是可以推到無限大的。

我都說fourier transform可以把所有的波型拆成sin跟cos的組合
既然是所有,就沒有針對哪個曲線,就算是指數曲線一樣能夠拆成sin跟cos的組合

然後nyquist取樣是最大頻率的兩倍,既然是最大頻率的兩倍
何來有比這更大的頻率?
除非頻率是無限大,那的確是沒有比無限大還大兩倍這種東西
但是前提是頻率無限大,你沒有給定這條件,就得出需要無限多取樣點才能得到完整曲線的結果,這不合理吧
司馬雲
6.  司馬雲 (發表於 2013年4月29日 19:20)
※ 引述《100000198803735》的留言:
> fourier transform跟取樣定理的確告訴你
> 只要你的取樣頻率比你的待測頻率高兩倍就可以作到無失真的取樣沒錯
> 不過那是理論
> 前提是你取樣的點都剛好在波峰跟波谷
> 所以實際面上來說
> 你要得到任一相位差的弦波
> 你的確是需要無限多的取樣點才能完全無失真
> 所以他第一個說法上是沒錯的

哪裡沒錯?fourier transform一樣可以把有相位差的弦波分解成sin跟cos的組合
這些技術本來就是以理論為基礎,沒有取樣定理的理論,哪有這些東西
100000198803735
1人給推

7.  100000198803735 (發表於 2013年4月29日 20:14)
ok~我假定我的立論不夠詳細
讓我在清楚一點說明
首先~我要說你最前面說得那些理論都是正確的
也的確是正確的推論
但我要再次強調~
那些都是理論上的
在實際上有著實際考量
假定你今天要去量化一個弦波
他的頻率是你取樣頻率的一半
同時你的取樣頻率跟他不同步
也是就說你每次取點的時候
他都不是剛好在波峰跟波谷
(這個幾乎是必定發生的)
那會發生什麼事呢?
你會得到一個頻率一樣的
但是振幅變小的量化結果
這就會發生失真
所以要避免這種情況發生
一般你會用更高的取樣頻率
來保證你可以得到頻率跟振幅的正確值
降低你的量化誤差
這跟你有沒有辦法把他化成sin或cos沒有關係
既然弦波都如此~何況其他更複雜的波形組合
所以我才會說第一個說法是沒錯的
在實務上增加取樣次數是可以降低失真的辦法
ZnJvbSBOQ1RVIENT
1人給推

8.  ZnJvbSBOQ1RVIENT (發表於 2013年4月29日 20:25)
※ 引述《司馬雲》的留言:
> ※ 引述《100000198803735》的留言:
> > fourier transform跟取樣定理的確告訴你
> > 只要你的取樣頻率比你的待測頻率高兩倍就可以作到無失真的取樣沒錯
> > 不過那是理論
> > 前提是你取樣的點都剛好在波峰跟波谷
> > 所以實際面上來說
> > 你要得到任一相位差的弦波
> > 你的確是需要無限多的取樣點才能完全無失真
> > 所以他第一個說法上是沒錯的
>
> 哪裡沒錯?fourier transform一樣可以把有相位差的弦波分解成sin跟cos的組合
> 這些技術本來就是以理論為基礎,沒有取樣定理的理論,哪有這些東西

的確傅立葉轉換可以做到這樣,但是問題是你的訊號是離散的。
對,你可以用 DFT 但是離散的東西就有誤差,
算 DFT 的時候樣點越密的出來的東西越不失真。
司馬雲
1人給推

9.  司馬雲 (發表於 2013年4月30日 09:59)
對沒學過溥利葉轉換的人說這些跟本是對牛彈琴
說理論跟事實不一樣的,我看你們跟本是不知道理論是什麼
如果不懂,就不要亂戰,很難看
Xeon
1人給推

10.  Xeon (發表於 2013年4月30日 10:43)
對於任意一個我們人工產生的訊號,可能是畫面、音效或是其它訊號
對於那些peak和斷點,你就這麼一套傅立葉?
那是真的要無限多組才可能“接近”零失真╮(╯_╰)╭
Xeon
1人給推

11.  Xeon (發表於 2013年4月30日 10:55)
先說,不知道原著所謂人工的任意曲線能不能包含訊號的方波
畢竟在數位訊號裡面大概這個多的是吧?
一個方波~用它N倍頻率取樣
然後就可以用正餘弦疊出完全一樣的?
振幅也一樣?困惑了
Andy
13.  Andy (發表於 2013年5月01日 01:37)
看完這篇知識增加了不少
頭暈的程度也多了不...........

P.S.大家討論就討論
火氣不要那麼大嘛
100000198803735
1人給推

14.  100000198803735 (發表於 2013年5月01日 13:35)
我想這應該是我最後在這篇文章PO文了
本來想說用白話文解釋就好
既然你要講理論
(彈琴彈的有點累了...)
你可以看一下關於oversampling的理論
同時如果你知道什麼是ADC的話
可以順便看一下delta-sigma ADC的原理
他們都是用高於待測頻率數倍(>2)的取樣頻率
來達到較高的解析度
或是你應該看一下實際在取樣會遇到的問題
當然~這只是建議
我想一個傅立葉轉換應該就可以打趴所有的問題了>.*
朱恩霖
15.  朱恩霖 (發表於 2013年6月16日 03:00)

自然界跟理論總是有差距的......
它的取樣結果應該只是趨近於吧...不可能真的剛剛好符合
波紋也不可能完全平滑波文...不然世界早就被人類創造了...
就算是人類創造出的訊號,仍然是用機器發出來的(除非你會發訊號,你說話的聲音也不是平滑聲波阿)

不用傅立葉那麼複雜啦...我打個簡單的比方:微基分XD
微積分本身就是逼近的概念...
不對...想想傅立葉好像是在微積分的系統下的...
Hongyi Wang
16.  Hongyi Wang (發表於 2014年4月10日 08:20)
※ 引述《國寶大師 李文恩》的留言:
> ※ 引述《司馬雲》的留言:
> > 第一個取樣說明跟本是亂寫
>
> 請注意文章的內容,該圖形為一「任意曲線」
> 請問要如何定義一任意曲線的頻率?
>
> 然而永遠有比「你說的頻率」大的頻率存在(你說100,我就說101,你再說101,我就說102......以此類推),所以此任意曲線的取樣頻率是可以推到無限大的。

贊同。其實傅立葉變化只是把函數從時域描述變為頻域描述。不會讓在時域描述下不成立的,反而在頻域描述下而成立。

比如自然中的壹個物體的邊界,我們把他看做由無數點組成。在描述這條曲線的時候,我們需要用有限的點來描述,用的描述點越多,越接近真實曲線。如果用無窮多個點來描述,那麽將會無窮接近真實曲線。所以,原文作者說的完全沒有錯誤,這是每本微積分教材最初講解的知識。

我並不是Computer Science或者Electrical Engineering專業的,但是在剛剛上大學學微積分時學習過傅立葉變換,之後也在讀碩士的時候在學Tribology這門課時,測量物體表面輪廓,得到幾十萬個樣本點,然後對其進行分析時,在Matlab下用過離散傅立葉變化,所以對傅立葉變化的理論也有壹些認識。對於壹條真實的曲線,我們很難給出壹個準確的函數來表示,所以需要對其進行取點,然後根據這些點用函數表示,所以真實情況下,若用離散傅立葉變化的話,采樣點越多,越接近真實曲線。對於真實曲線,用傅立葉函數表示的話,正弦函數的頻率需要無窮大才能無窮接近自然界中的真實曲線。

對於司馬雲所說的已知壹條sin(t)的曲線,只需要二倍頻率采樣那就不會失真。首先,假設這個沒有什麽錯誤。然後我們會發現,並不是所有的曲線都是壹條正弦曲線。而司馬雲說所有的曲線都可以分解為不同頻率的正弦曲線的和。對,但是需要無窮多個正弦函數才能接近真實曲線。這樣就需要無窮大的頻率的二倍頻率進行無失真采樣。無窮大頻率,這種采樣是做不到的,所以說對於自然界真實曲線的采樣,只能盡量接近,不能做到完全還原。所以說,對於自然界中的真實曲線來說,采樣點越多越接近真實曲線,這個不管是在時域下還是頻域下都是正確的。

以上是對於自然界中真實曲線的討論。之後,我對於物體建模-->編輯-->呈現於屏幕 非常感興趣,因為平常用軟件建模時,模型顯示會有鋸齒,而專業顯卡會對專業軟件有特殊支持,會讓線條變得光滑。另外,對於遊戲視頻錄制,比如錄制3DS的視頻,其分辨率比較低,那上傳的壹些視頻網站的高分辨率視頻格式下顯示起來很難看,有很多鋸齒,是否有視頻處理技術可以減小鋸齒。壹個是前處理,壹個是後處理。我對這些技術很好奇,看了本文後了解了壹些,雖然不是很懂。

我有壹個想法,把建模和轉化輸出結合起來進行抗鋸齒。也就是讓建模軟件根據輸出的分辨率引進壹個消除鋸齒的技術。這樣把前後處理結合起來應該會很不錯。不過需要對建模軟件進行比較復雜的改動,如果實現,應該是壹個對遊戲輸出端很有效率的抗鋸齒。不懂具體怎麽做,因為不是學習這個領域的,所以這個建議完全是想象,若很可笑請見諒。

我是大陸的,對繁體字什麽的也不了解,所以以上都是寫完簡體後再用軟件轉換的,希望理解起來沒有什麽錯誤。
發表回應
謹慎發言,尊重彼此。按此展開留言規則