5264e375c40e52f98e470cac16852866 反鋸齒一直以來都是顯示卡廠商必爭之地,尤其在推出新架構的產品時,往往會強調自家的新顯示卡有多麼強大的反鋸齒功能,不過聽了這麼多商業術語之後,你真的瞭解鋸齒的產生原因與反鋸齒技術的運作原理嗎?

快速瀏覽:

反鋸齒從取樣開始

為了要說明3D繪圖產生鋸齒的原因,我們需要先討論一下取樣(Sampling,中文為取樣或採樣)的問題。不同於類比儲存所儲存的資料為連續式的資訊,數位儲存的資料則為離散式(不連續)的資訊,兩者最大的差異在於,連續式記錄方式可以包含無限多的資料,而離散式記錄方式只包含有限的資料。

舉個例子來說,若我們在2白紙上畫出1條曲線,以宏觀的角度來看,白紙就是用類比的方式記錄下這條曲線的資訊,但是我們如果把這條曲線以數位的方式儲存,我們就需要對它進行取樣。取樣最簡單的方式就是使用座標系統記錄曲線,以下方附圖為例,我們可以沿著橫軸對曲線進行取樣,只要將每個取樣點所記錄到的數值連接起來,就可以得到該條曲線。

▲上方的圖片取樣數量較少,描繪出的曲線就充滿鋸齒,下方的圖片取樣數量較多,雖然仍無法記錄曲線的完整資訊,但是線條比上方圖片平滑,而且更接近原始曲線。

宏觀與微觀

宏觀與微觀是種相對的尺度概念,代表著我們如何觀查系統,宏觀是以較大的尺度對系統進行完整的分析,而微觀則是以渺小的尺度詳細檢視系統細節。

舉個簡單的例子,如果我們以宏觀的尺度觀察人體,我們會看到器官、血液等組織如何運作,以支持人類的生命現象,然而以微觀的層級觀查,會則會看到單一細胞的行為。

文中題及以宏觀的尺度觀察白紙上的曲線,指的是觀察曲線的本體, 它是平滑且連續的曲線,然而若以原子尺度進行微觀觀察,我們還是會發現原子與原子間並非連續排列,因此強調宏觀尺度。

取樣不足是關鍵

但是現在問題來了,從附圖中我們可以清楚地看到,當取樣點比較少的時候,繪製出的曲線失真程度會比較高,取樣點較多的話,描繪出的曲線就比較平滑,然而我們不可能對該條曲線進行無限多次的取樣,所以說我們只能透過有限的資料,盡量描繪出最接近原始曲線的圖型,不可能畫出不失真的完整圖型。

同樣的問題也會發生在3D繪圖中,以解析度為1920 x 1080的3D畫面為例,代表著我們對3D模型進行1920 x 1080次取樣,每個取樣都對應1個像素。由於3D模型的邊緣可能會在像素範圍之內,因此對3D模型進行數量有限的取樣,得到的結果勢必會出現失真。

如果想要減低失真情況,最直接的方法就是提高取樣數量,但是在使用在螢幕解析度有限的前提下,能夠進行的取樣數量有一定上限,因此需要透過其他的技術來提高取樣數,並且適當地表現出來,達成讓影像更平滑的終極目標。

▲從上圖中可以明顯看到取樣數對失真程度的影響。在使用較少像素的案例中,失真情況相當嚴重,隨著取樣數量的增加,形狀雖然還是有一定程序的失真,不過邊緣就比較平滑,整體形狀更接近原始圖型。

物體移動也造成失真

另一個因取樣而產生的問題,就是3D物體在移動時,可能會因為取樣數量不足,而造成取樣失真,這個現象稱為polygon popping。當形狀為細長型且長或寬小於像素寬度的3D物體移動時,往往會因3D物體會在各像素取樣點間穿梭,當3D物體覆蓋到取樣點時,它就會被繪製到畫面上,但如果3D物體剛好落在取樣點的縫隙間,我們就不會在畫面上看到這些物體。

舉個簡單的例子,電線是3D遊戲中常見的細長物體,如果在3D模型中電線的直徑小於像素邊長,在畫面移動時,電線的某些部分就可能就無法覆蓋到取樣點,而被忽略不被繪製到畫面上,看在我們眼裡,這條電線就會變成有如虛線般分成好幾段,中間有些部分不見了,而且會隨著畫面的移動閃爍。這個狀況也算是鋸齒的現象之一,同樣可以透過提高取樣點數量來減輕問題程度。

圖片左側是3D模型示意,格子中的小點為取樣點,圖片右側則為對3D模形取樣後,繪製到螢幕上的圖像。由於3D物體無法完全覆蓋取樣點,所以當3D物體在畫面中移動時(由上方轉變至下方),就會產生不正確的圖像。

取樣點 (Sampling point)

為了要在螢幕上顯示3D繪圖的圖型,必需將以向量格式的3D模型透過柵格化(Rasterisation,或稱光柵化)轉換成點陣圖,其中轉換的方式就是把3D模型投影到平面上,再檢查投影所得的圖像有沒有覆蓋到取樣點,並依據有無覆蓋來決定該像素的顏色。

在最基本的狀況下,取樣點都位於每個像素中央,每個像素也只具有1個取樣點,不過像是SSAA取樣方式就會在單一像素安排多個取樣點,而且取樣點位於不一定在正中央。

延伸閱讀:

萬用 3D 遊戲特效增強器:讓遊戲光影更真實,跟鋸齒說再見

Game Fire :調整 PC 設定、最佳化遊戲效能就靠它

一個打兩個,NVIDIA GeForce GTX TITAN 對決 GTX 680 SLI 實測

(後面還有:提高取樣數解決影像鋸齒)

使用 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倍頻率取樣
然後就可以用正餘弦疊出完全一樣的?
振幅也一樣?困惑了
偉偉
13.  偉偉 (發表於 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的視頻,其分辨率比較低,那上傳的壹些視頻網站的高分辨率視頻格式下顯示起來很難看,有很多鋸齒,是否有視頻處理技術可以減小鋸齒。壹個是前處理,壹個是後處理。我對這些技術很好奇,看了本文後了解了壹些,雖然不是很懂。

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

我是大陸的,對繁體字什麽的也不了解,所以以上都是寫完簡體後再用軟件轉換的,希望理解起來沒有什麽錯誤。

發表回應

謹慎發言,尊重彼此。按此展開留言規則