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

ADVERTISEMENT

跳過渲染階段效能更高

前述的SSAA與MSAA等反鋸齒技術,都是從3D模型階段就開始著手處理,不過這種方式的運算量比較龐大,可能讓顯示卡負荷不了,於是給了另一派反鋸齒技術發展的契機,如果對渲染完成的圖像再進行反鋸齒處理,豈不是能有效降低效能耗損。

後處理就像修片

後處理(Post-processing)指的是處理渲染完成儲存於Frame buffer中的圖像,常見的後處理包括有HDR、光暈、動態模糊等特效,其優點為處理的對象為2D圖像,所以能夠降低前段處理的運算負荷。

以MLAA(Morphological Anti-Aliasing)為首的反鋸齒技術,就是在後處理對圖像進行反鋸齒處理,其優點不外乎效能高於SSAA、MSAA等方式,但是由於它是對渲染完成的圖像進行處理,所以呈現的效果會比較差。

舉個簡單的例子,SSAA就像是拍照前將燈光、焦距等參數調整至最佳狀態,需要花比較多的時間,能夠得到最好的效果,然而MLAA則是拍完照後才進行修片,雖然節省時間,但能夠調校的範圍比較有限,效果勢必不如前者。

後處理相容性最廣

在後處理階段進行反鋸齒除了可以減輕運算負擔外,它還有個決定性的優勢,就是理論上能套用於所有遊戲或是3D繪圖技術。

由於它的是針對Frame buffer中的圖像進行加工,因此可以在不改動程式也不需要軟體支援的前提下,加入後處理濾鏡就能進行反鋸齒實作,就算是使用光線追蹤(Ray tracing)的方式渲染,也難不倒後處理類型的反鋸齒技術。

成也後處理,敗也後處理。對渲染所得的平面圖像進行加工,說穿了就是將圖像中的鋸齒模糊化,所以得到的最終結果清晰度會比較低,此外程式無法於後處理階段對3D模型進行分析,也就是說無法改善Polygon popping這種失真情況。

MLAA直接分析平面圖像

以MLAA為例,其運作流程有3大步驟,首先它會從圖像中找到色彩不連續的像素(也就是和周圍顏色不一樣的像素),然後分析這些像素排列的形狀,並將它們歸類為事先定義的排列模式,最後則是依據這些模式混合鄰近像素的色彩。

在尋找色彩不連續區的階段,程式會搜尋所有相鄰的像素,找出色彩變化較大區域,劃分不同色塊間的分界線,並將長度最長的分界線標註為主要邊(primary edge)。接下來程式會沿著主要邊,找出與主要邊垂直的分界線,通常往主要邊的2端搜尋,都能找到對應的分界線,它們會被標註為次要邊(secondary edge)。

在決定各色塊的主要邊與次要邊之後,可以將它們組合成L形、U形、Z形等排列模式,其中U形與Z形可以再一步拆解成2個L形,因此所有的色塊邊緣都可以被分解成最基本的L形模式。

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

▲MLAA會分析圖像中色彩不連續的邊緣,將這些邊緣歸類成L形、U形以及Z形等排列模式,然後再將U型及Z型拆解成L型。

依面積進行調色

分析完色彩不連續的邊緣後,我們可以得到許多L型模式,由於其主要邊可能是從U形或Z形拆解而得,所以當原始主要邊只有1個像素寬時,新產生的L型模式主要邊長度就會只有0.5個像素寬度,而原始主要邊長度大於1時,新主要邊會維持原始長度的一半。然而次要邊則是不論原始常度有多長,都只取1個像素寬作為新次要邊的長度。

接下來程式會將主要邊的頂點與次要邊的中點連接起來,如此會圍出1個封閉三角形,這時候程式會計算這個三角型在每個像素中佔據的面積,並且依照面積分配的比例調合各色塊交接的顏色,就可以達到消除鋸齒的目的。

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

▲由於MLAA只會對渲染完成後的圖像進行反鋸齒處理,並不會在3D模型取樣階段增加取樣點,所以當polygon的邊緣移動幅度小於像素大小時 (從藍線變為綠線) ,就會面臨束手無策的窘境。左圖中每個像素只有1個取樣點,當取樣點被polygon覆蓋的數量沒有改變時,渲染所得的畫面就不會有所變化,對於MLAA來說,無法透過平滑化來減輕polygon popping失真。右圖則是增加取樣點的反鋸齒案例 (SSAA) ,由於取樣點被覆蓋的數量會改變,所以可以透過漸層色來降低polygon popping的干擾。

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

▲這張圖可以清楚地表達MLAA在做什麼,簡單地說,他就是分析色彩的分佈,將界線平滑化。

TXAA加入前後幀比對

MLAA以及其他如SMAA(Enhanced Subpixel Morphological Anti-Aliasing)、FXAA(Fast Approximate Anti-Aliasing)以及TXAA(Temporal Anti-Aliasing)等技術,都是在後處理階段進行反鋸齒處理的技術,它們的問題在於它的概念就是以清晰度換取平滑度,所以處理過後的圖像會比較模糊。

其中比較特別的是NVIDIA最新推出的TXAA,它除了會比對單一圖像中的資訊,也會將前一幀圖像加入比較,可以提升反鋸齒品質,尤其對於移動中的物件效果更是顯著。

後處理成主流

無論是哪種後處理反鋸齒技術,理論上效果都還是無法超越從根本做起的SSAA,其原因不外乎SSAA能在比其他反鋸齒技術擁有更豐富的原始圖像資料下,進行反鋸齒處理。

不過在螢幕解析度越來越大,遊戲畫面也越來越華麗的今天,使用SSAA或MSAA的效能代價太高,後處理反鋸齒技術能在確保遊戲效能的前題下,提供相對細緻、可接受的圖像品質,取得使用者可以接受的平衡。

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

▲左圖為原始圖像,以及分析後所得到的排列模式,紅線則為連接主要邊的頂點與次要邊的中點所得。右圖則為反鋸齒處理後的結果。

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

▲此圖為座標為c5、d5、e5像素的放大圖。其主要邊為v1v2,次要邊為v0v1,而紅線圍出的區域則為文中提及的封閉三角形,該三角形佔據c5像素3分之1的面積,佔據d5像素24分之1。因此c5的新顏色就是1/3的c4與2/3的c5混合,而d5則是1/24的d4與23/24的c5混合。

光線追蹤(Ray tracing)

我們比較熟悉的3D繪圖技術是以前面提過的柵格化應用,而光線追蹤則是另外一種完全不同的繪圖方式。兩者最大的差異在於柵格化是先建立3D模型後,再將所有物件投影到平面上,而光線追蹤則是採用的方法,為從攝影機射出假想的視線光(View ray),當視線光碰到物體反射後被遮蔽即形成陰影光(Shadow ray),程式只要不斷追蹤這些光線,就可以渲染出光影效果更加逼真的圖像。

光線追蹤最大的問題,在於它需要的運算量遠大於柵格化渲染方式,低落的效能讓它不適合應用於遊戲等即時3D繪圖。通常為了要提高效能,程式會設定光線反射次數的上限,或是視線光行走多遠沒有遇到反射,就停止追蹤該條視線光,這個方式雖然會加快渲染的速度,但是也會降低渲染的擬真程式,也可能會造成繪圖錯誤。

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

▲光線追蹤的示意圖,假想的視線光從射影機射出,並且一路折射至光源為止,行進方向與真實的光線恰好相反。(圖片來源:wikipedia)

 

本文同步刊載於電腦王雜誌
 
 顯示卡 4 大反鋸齒技術探討:鋸齒的產生與消除,前處理、後處理之爭
歡迎加入電腦王雜誌粉絲團

國寶大師 李文恩
作者

電腦王特約作者,專門負責硬派內容,從處理器、主機板到開發板、零組件,尖端科技都一手包辦,最近的研究計畫則包括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的視頻,其分辨率比較低,那上傳的壹些視頻網站的高分辨率視頻格式下顯示起來很難看,有很多鋸齒,是否有視頻處理技術可以減小鋸齒。壹個是前處理,壹個是後處理。我對這些技術很好奇,看了本文後了解了壹些,雖然不是很懂。

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

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