2013.04.29 14:55

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

ADVERTISEMENT

跳過渲染階段效能更高

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

後處理就像修片

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

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

ADVERTISEMENT

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

後處理相容性最廣

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

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

ADVERTISEMENT

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

MLAA直接分析平面圖像

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

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

ADVERTISEMENT

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

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

ADVERTISEMENT

依面積進行調色

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

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

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

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

TXAA加入前後幀比對

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

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

後處理成主流

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

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

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

▲此圖為座標為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繪圖。通常為了要提高效能,程式會設定光線反射次數的上限,或是視線光行走多遠沒有遇到反射,就停止追蹤該條視線光,這個方式雖然會加快渲染的速度,但是也會降低渲染的擬真程式,也可能會造成繪圖錯誤。

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

 

本文同步刊載於電腦王雜誌
 
 
歡迎加入電腦王雜誌粉絲團

ADVERTISEMENT