5.4 鋸齒和抗鋸齒
想象一個大的黑色三角形在白色背景上緩慢移動。當一個螢幕網格單元被三角形覆蓋時,代表這個單元的畫素值應該在強度上線性(“*滑”兩個字打不出來)下降。在各種基本渲染器中通常發生的情況是,網格單元的中心被覆蓋的那一刻,畫素顏色立即從白色變為黑色。標準GPU渲染也不例外。請參見圖5.14的最左側列。
圖5.14. 上面一行顯示了三個影像,其中三角形、直線和一些點具有不同級別的抗鋸齒。下排影像是上排的放大圖。最左邊的列每個畫素只使用一個樣本,這意味著沒有使用抗鋸齒。中間列的影像每個畫素使用四個樣本(以網格模式)渲染,右列每個畫素使用八個樣本(在4×4棋盤格中,對一半的正方形進行取樣)。
三角形以畫素為單位顯示為存在或不存在。繪製的線條也有類似的問題。因此,邊緣看起來呈鋸齒狀,因此這種視覺偽影被稱為“鋸齒”,在動畫時會變成“爬行動物”。更正式地說,這個問題被稱為鋸齒,避免它的努力被稱為抗鋸齒技術。
取樣理論和數字濾波的主題足夠大,足以填滿自己的書[559,1447,1729]。由於這是渲染的關鍵領域,因此將介紹取樣和濾波的基本理論。然後,我們將專注於當前可以實時完成的工作以減輕鋸齒偽影。
5.4.1 取樣和濾波理論
渲染影像的過程本質上是一個取樣任務。之所以如此,是因為影像的生成是對三維場景進行取樣以獲得影像中每個畫素(離散畫素陣列)的顏色值的過程。要使用紋理對映(第6章),必須重新取樣紋素才能在不同條件下獲得良好的結果。為了在動畫中生成一系列影像,通常以統一的時間間隔對動畫進行取樣。本節介紹了取樣、重建和過濾的主題。為簡單起見,大多數材料將在一維中呈現。這些概念也自然擴充套件到二維,因此可以在處理二維影像時使用。
圖5.15顯示瞭如何以均勻間隔對連續訊號進行取樣,即離散化。此取樣過程的目標是以數字方式表示資訊。這樣做可以減少資訊量。然而,需要對取樣訊號進行重建以恢復原始訊號。這是通過對取樣訊號進行濾波來完成的。
圖5.15. 對連續訊號(左)進行取樣(中),然後通過重建恢復原始訊號(右)。
無論何時進行取樣,都可能發生混疊。這是一個不需要的人工製品,我們需要與混疊作鬥爭以生成令人愉悅的影像。混疊的一個典型例子是在老西部片中看到的電影攝影機拍攝的旋轉馬車車輪。由於輻條的移動速度比相機記錄影像的速度要快得多,因此車輪可能看起來在緩慢旋轉(向後或向前),甚至看起來根本沒有旋轉。這可以在圖5.16中看到。之所以會出現這種效果,是因為車輪的影像是在一系列時間步長中拍攝的,稱為時間混疊。
圖5.16. 頂行顯示了一個旋轉的輪子(原始訊號)。這在第二行中取樣不足,使其看起來向相反方向移動。這是由於取樣率過低而導致混疊的示例。在第三行,取樣率恰好是每轉兩個樣本,我們無法確定輪子在哪個方向旋轉。這是Nyquist極限。在第四行,取樣率高於每轉兩個樣本,我們突然可以看到輪子向正確的方向旋轉。
計算機圖形學中鋸齒的常見例子是光柵化線或三角形邊緣的“鋸齒”,被稱為“螢火蟲”的閃爍高光,以及帶有棋盤格圖案的紋理被縮小時(第6.2.2節)。
當以太低的頻率對訊號進行取樣時,就會發生混疊。然後,取樣訊號看起來是比原始訊號頻率低的訊號。如圖5.17所示。對於要正確取樣的訊號(即,可以從樣本中重建原始訊號),取樣頻率必須大於要取樣的訊號的最大頻率的兩倍。這通常被稱為取樣定理,取樣頻率被稱為奈奎斯特速率 [1447] 或奈奎斯特極限,以瑞典科學家Harry Nyquist(1889-1976) 命名,他在1928年發現了這一點。奈奎斯特極限也如圖5.16所示。該定理使用術語“最大頻率”這一事實意味著訊號必須是帶限的,這只是意味著沒有任何頻率超過一定的限制。換句話說,訊號必須相對於相鄰樣本之間的間距足夠*滑。
圖5.17. 藍色實線是原始訊號,紅色圓圈表示均勻間隔的取樣點,綠色虛線是重建訊號。上圖顯示取樣率過低。因此,重建的訊號似乎具有較低的頻率,即原始訊號的混疊。底部顯示了恰好是原始訊號頻率兩倍的取樣率,重建的訊號在這裡是一條水*線。可以證明,如果取樣率稍微增加一點,完美的重建是可能的。
使用點樣本進行渲染時,3D場景通常不會受到頻寬限制。三角形的邊緣、陰影邊界和其他現象會產生不連續變化的訊號,因此會產生無限的頻率[252]。此外,無論樣本有多緊密,物件仍然可以足夠小以至於根本無法對其進行取樣。因此,在使用點取樣渲染場景時,不可能完全避免鋸齒問題,我們幾乎總是使用點取樣。但是,有時可以知道訊號何時是帶限的。一個例子是紋理應用於表面時。與畫素的取樣率相比,可以計算紋理樣本的頻率。如果此頻率低於Nyquist限制,則無需特殊操作即可正確取樣紋理。如果頻率太高,則使用各種演算法對紋理進行頻帶限制(第6.2.2節)。
重建
給定一個帶限取樣訊號,我們現在將討論如何從取樣訊號中重建原始訊號。為此,必須使用過濾器。三種常用的過濾器如圖5.18所示。請注意,濾波器的面積應始終為1,否則重建的訊號可能會出現增長或縮小。
圖5.18. 左上方顯示box過濾器,右上方顯示tent過濾器。底部顯示了sinc濾波器(其固定在x軸上)。
在圖5.19中,box濾波器(最*鄰)用於重建取樣訊號。這是使用最差的濾波器,因為生成的訊號是不連續的階梯狀。 儘管如此,由於其簡單性,它經常用於計算機圖形學。從圖中可以看出,box過濾器被放置在每個取樣點上,然後進行縮放,使過濾器的最高點與取樣點重合。所有這些縮放和轉換的box函式的總和就是右側顯示的重建訊號。
圖5.19. 使用box濾波器重建取樣訊號(左)。這是通過將box過濾器放置在每個取樣點上,並在y方向上對其進行縮放,以使過濾器的高度與取樣點相同。其總和是重建訊號(右)。
box過濾器可以更換為任何其他過濾器。在圖5.20中,tent濾波器也稱為三角形濾波器,用於重建取樣訊號。請注意,該濾波器實現了相鄰樣本點之間的線性插值,因此它比box濾波器更好,因為重建的訊號現在是連續的。
圖5.20. 使用tent濾波器重建取樣訊號(左)。重建的訊號如右圖所示。
然而,使用tent濾波器的訊號的*滑度較差;取樣點處存在陡峭的斜率變化。這與tent過濾器不是完美的重建過濾器這一事實有關。為了獲得完美的重建,必須使用理想的低通濾波器。訊號的頻率分量是正弦波:\(\textrm{sin}(2πf)\),其中\(f\)是該分量的頻率。鑑於此,低通濾波器會去除所有頻率高於濾波器定義的特定頻率的頻率分量。直觀地說,低通濾波器去除了訊號的尖銳特徵,即濾波器模糊了它。理想的低通濾波器是sinc濾波器(圖5.18底部):
傅立葉分析理論[1447]解釋了為什麼sinc濾波器是理想的低通濾波器。簡而言之,推理如下。理想的低通濾波器是頻域中的box濾波器,當它與訊號相乘時,它會去除濾波器寬度以上的所有頻率。將box濾波器從頻域變換到空間域給出了一個sinc函式。同時,將乘法運算轉化為卷積函式,這也是我們在本節中一直使用的,但沒有實際描述該術語。
使用sinc濾波器重建訊號可以得到更*滑的結果,如圖5.21所示。取樣過程會在訊號中引入高頻成分(突變),低通濾波器的任務就是去除這些成分。事實上,sinc濾波器消除了所有頻率高於取樣率1/2的正弦波。如公式5.22所示,sinc 函式是取樣頻率為1.0(即取樣訊號的最大頻率必須小於 1/2)時的完美重建濾波器。更一般地,假設取樣頻率為\(f_s\) ,即相鄰樣本之間的間隔為\(1/f_s\)。對於這種情況,完美的重建濾波器是\(\textrm{sinc}(f_sx)\),它會消除所有高於\(f_s/2\)的頻率。這在重新取樣訊號時很有用(下一節)。但是,sinc的濾波器寬度是無限的,並且在某些區域為負數,因此在實踐中很少有用。
圖5.21. 在這裡,sinc濾波器用於重建訊號。sinc濾波器是理想的低通濾波器。
一方面,在低質量的box和tent過濾器之間有一個有用的中間地帶,另一方面是不切實際的sinc過濾器。最廣泛使用的過濾器函式[1214, 1289, 1413, 1793]介於這些極端之間。所有這些濾波器函式都與sinc函式有一些*似,但對它們影響的畫素數量有限制。最接*sinc函式的濾波器在其部分域上具有負值。對於不希望或不切實際的負濾波器值的應用,通常使用沒有負波瓣的濾波器(通常稱為高斯濾波器,因為它們要麼源自高斯曲線,要麼類似於高斯曲線)[1402]。第12.1節更詳細地討論了過濾器函式及其使用。
使用任何濾波器後,都會得到一個連續的訊號。然而,在計算機圖形學中,我們不能直接顯示連續訊號,但我們可以使用它們將連續訊號重新取樣到另一個大小,即放大或縮小訊號。接下來討論這個話題。
重取樣
重取樣用於放大或縮小取樣訊號。假設原始樣本點位於整數座標(0,1,2,...),即樣本之間有單位間隔。此外,假設在重取樣後,我們希望新的樣本點以樣本之間的間隔\(a\)均勻定位。對於\(a>1\),進行縮小(下采樣),對於\(a<1\),進行放大(上取樣)。
放大是兩者中較簡單的情況,所以讓我們從它開始。假設如上一節所示重建取樣訊號。直觀地說,由於訊號現在被完美地重建並且是連續的,所需要的只是以期望的間隔對重建的訊號進行重新取樣。這個過程可以在圖5.22中看到。
圖5.22. 在右邊,重建的訊號已經以兩倍的取樣率重新取樣,即發生了放大。
但是,當發生縮小時,此技術不起作用。原始訊號的頻率對於取樣率來說太高以避免混疊。相反,已經表明應該使用\(\textrm{sinc}(x/a)\)的濾波器從取樣的訊號中建立連續訊號[1447,1661]。之後,可以按所需的時間間隔重新取樣。這可以在圖5.23中看到。換句話說,通過在這裡使用\(\textrm{sinc}(x/a)\)作為濾波器,增加了低通濾波器的寬度,從而去除了更多訊號的高頻成分。如圖所示,(單個sinc的)濾波器寬度加倍,以將重取樣率降低到原始取樣率的一半。將其與數字影像相關聯,這類似於首先對其進行模糊處理(以去除高頻),然後以較低的解析度重新取樣影像。
圖5.23. 左邊是取樣訊號和重建訊號。在右側,過濾器寬度加倍以使樣本之間的間隔加倍,即進行了縮小。
以取樣和過濾理論作為框架,現在討論實時渲染中用於減少混疊的各種演算法。
5.4.2 基於螢幕的抗鋸齒
如果沒有很好地取樣和過濾,三角形的邊緣會產生明顯的偽影。陰影邊界、鏡面高光和其他顏色快速變化的現象可能會導致類似的問題。本節討論的演算法有助於提高這些情況的渲染質量。它們的共同點是它們是基於螢幕的,即它們只對管線的輸出樣本進行操作。沒有一種最好的抗鋸齒技術,因為每種技術在質量、捕捉清晰細節或其他現象的能力、運動過程中的外觀、記憶體成本、GPU要求和速度方面都有不同的優勢。
在圖5.14中的黑色三角形示例中,一個問題是取樣率低。在每個畫素的網格單元的中心採集一個樣本,因此對單元的瞭解最多的是中心是否被三角形覆蓋。通過在每個螢幕網格單元中使用更多樣本並以某種方式混合這些樣本,可以計算出更好的畫素顏色。如圖5.24所示。
圖5.24. 在左側,一個紅色三角形被渲染,一個樣本位於畫素的中心。由於三角形沒有覆蓋樣本,因此畫素將是白色的,即使畫素的大部分被紅色三角形覆蓋。在右側,每個畫素使用四個樣本,可以看出,其中兩個被紅色三角形覆蓋,從而產生粉紅色的畫素顏色。
基於螢幕的抗鋸齒方案的一般策略是使用螢幕的取樣模式,然後對樣本進行加權和求和以產生畫素顏色\(\textbf{p}\):
其中\(n\)是為畫素獲取的樣本數。函式\(\textbf{c}(i,x,y)\)是一個樣本顏色,而\(w_i\)是一個權重,在[0,1]範圍內,樣本將有助於整個畫素的顏色。樣本位置是根據它在系列1,...,n的某個樣本來獲取的,並且該函式還可以選擇使用畫素位置(x,y)的整數部分。換句話說,每個樣本在螢幕網格上的取樣位置是不同的,並且可選地,取樣模式可以隨畫素而變化。樣本通常是實時渲染系統(以及大多數其他渲染系統)中的點樣本。因此,函式\(\textbf{c}\)可以被認為是兩個函式。首先,函式\(\textbf{f}(i,n)\)檢索螢幕上需要樣本的浮點\((x_f,y_f)\)位置。然後對螢幕上的這個位置進行取樣,即檢索該精確點的顏色。選擇取樣方案並配置渲染管道以計算特定子畫素位置的樣本,通常基於每幀(或每應用程式)設定。
抗鋸齒中的另一個變數是\(w_i\),即每個樣本的權重。這些權重總和為1。實時渲染系統中使用的大多數方法都為其樣本賦予了統一的權重,即\(w_i = \frac{1}{n}\)。圖形硬體的預設模式,畫素中心的單個樣本,是上述抗鋸齒方程的最簡單情況。只有一項,該項的權重為1,取樣函式\(f\)總是返回被取樣畫素的中心。
每個畫素計算多個完整樣本的抗鋸齒演算法稱為超級取樣(或過取樣)方法。概念上最簡單的全場景抗鋸齒(FSAA),也稱為“超級取樣抗鋸齒”(SSAA),以更高解析度渲染場景,然後過濾相鄰樣本以建立影像。例如,假設1280×1024畫素的影像是需要的。如果你在螢幕外渲染2560×2048的影像,然後在螢幕上*均每個2×2畫素區域,則會生成所需的影像,每個畫素有四個樣本,並使用box過濾器進行過濾。請注意,這對應於圖5.25中的2×2網格取樣。這種方法成本高,因為所有子樣本必須完全著色和填充,每個樣本都有一個z緩衝區深度。FSAA的主要優勢是簡單。此方法的其他低質量版本僅在一個螢幕軸上以兩倍的速率進行取樣,因此稱為1×2或2×1超級取樣。通常,為簡單起見,使用二次方解析度和box濾波器。 NVIDIA的動態超解析度功能是一種更精細的超級取樣形式,其中場景以更高的解析度渲染,並使用13個樣本的高斯濾波器來生成顯示的影像[1848]。
圖5.25. 一些畫素取樣方案的比較,範圍從每個畫素的最少樣本到最多樣本。Quincunx共享角點樣本並將其中心樣本加權為畫素最終顏色的一半。2×2旋轉網格比直線2×2網格捕獲幾乎水*邊緣的更多灰度級。類似地,儘管使用的樣本較少,但8-rooks模式比4×4網格捕獲更多的灰度級。
一種與超級取樣相關的取樣方法是基於累積緩衝區的思想[637,1115]。這種方法不是使用一個大的螢幕外緩衝區,而是使用一個與所需影像具有相同解析度的緩衝區,但每個通道的顏色位更多。為了獲得一個場景的2×2取樣,生成了四個影像,檢視根據需要在螢幕x或y方向移動了半個畫素。生成的每個影像都基於網格單元內的不同樣本位置。每幀必須重新渲染場景幾次並將結果複製到螢幕的額外成本使得該演算法對於實時渲染系統來說成本很高。當效能不重要時,它對於生成更高質量的影像很有用,因為每個畫素都可以使用任意數量的樣本,放置在任何地方[1679]。累積緩衝區曾經是一個單獨的硬體。它在OpenGL API中得到直接支援,但在3.0版中已棄用。在現代GPU上,可以在畫素著色器中通過對輸出緩衝區使用更高精度的顏色格式來實現累積緩衝區概念。
當物件邊緣、鏡面高光和銳利陰影等現象導致顏色突然變化時,需要額外的樣本。通常可以使陰影更柔和,使高光更*滑以避免鋸齒。特定物件型別的尺寸可以增加,例如電線,以保證它們沿其長度的每個位置覆蓋至少一個畫素[1384]。物件邊緣的鋸齒仍然是一個主要的取樣問題。可以使用分析方法,在渲染過程中檢測物件邊緣並將其影響考慮在內,但這些方法通常比簡單地獲取更多樣本更昂貴且魯棒性較差。然而,諸如保守光柵化和光柵化順序檢視等GPU特性開闢了新的可能性 [327]。
超級取樣和累積緩衝等技術通過生成完全指定的具有單獨計算的著色和深度的樣本來工作。整體增益相對較低且成本較高,因為每個樣本都必須通過畫素著色器。
多重取樣抗鋸齒(MSAA)通過為每個畫素計算一次表面的著色並在樣本之間共享此結果來降低高計算成本。例如,每個片段的畫素可能有四個(x,y)樣本位置,每個位置都有自己的顏色和z-depth,但畫素著色器僅對應用於畫素的每個物件片元進行一次評估。如果所有MSAA位置樣本都被片段覆蓋,則在畫素中心評估著色樣本。如果片段覆蓋較少的位置樣本,則可以移動著色樣本的位置以更好地表示覆蓋的位置。例如,這樣做可以避免紋理邊緣的陰影取樣。這種位置調整稱為質心取樣或質心插值,如果啟用,則由GPU自動完成。質心取樣避免了非三角形問題,但可能導致導數計算返回不正確的值 [530,1041]。請參見圖5.26。
圖5.26. 在中間,一個畫素與兩個物件重疊。紅色物體覆蓋了三個樣本,藍色只有一個。畫素著色器評估位置以綠色顯示。由於紅色三角形覆蓋了畫素的中心,因此該位置用於著色器評估。藍色物件的畫素著色器在樣本位置進行評估。對於MSAA,在所有四個位置都儲存了單獨的顏色和深度。右側顯示了EQAA的2f4x模式。這四個樣本現在有四個ID值,它們索引儲存的兩種顏色和深度的表。
MSAA比純超級取樣方案更快,因為片段僅被著色一次。它專注於以更高的速率對片段的畫素覆蓋進行取樣並共享計算出的著色。可以通過進一步解耦取樣和覆蓋來節省更多記憶體,這反過來可以使抗鋸齒更快——佔用的記憶體越少,渲染速度越快。NVIDIA於2006年推出了覆蓋取樣抗鋸齒(CSAA),AMD緊隨其後推出了增強質量抗鋸齒 (EQAA)。這些技術通過以更高的取樣率僅儲存片段的覆蓋範圍來工作。例如,EQAA的“2f4x”模式儲存兩個顏色和深度值,在四個取樣位置之間共享。顏色和深度不再針對特定位置儲存,而是儲存在表格中。然後,四個樣本中的每個樣本只需要一位來指定兩個儲存值中的哪一個與其位置相關聯。請參見圖5.26。覆蓋樣本指定每個片段對最終畫素顏色的貢獻。如果超過了儲存的顏色數量,儲存的顏色將被驅逐,其樣本被標記為未知。這些樣本對最終顏色沒有貢獻 [382,383]。對於大多數場景,包含三個或更多可見不透明片段的畫素相對較少,這些片段的著色完全不同,因此該方案在實踐中表現良好[1405]。然而,為了獲得最高質量,《極限競速:地*線2》遊戲採用4倍 MSAA,儘管EQAA具有效能優勢[1002]。
將所有幾何圖形渲染到多樣本緩衝區後,將執行解析操作。此過程將樣本顏色*均在一起以確定畫素的顏色。值得注意的是,在使用具有高動態範圍顏色值的多重取樣時可能會出現問題。在這種情況下,為避免偽影,你通常需要在解析[1375]之前對值進行色調對映。這可能會代價很高,因此可以使用對色調對映函式的更簡單*似或其他方法[862,1405]。
預設情況下,MSAA使用box過濾器解析。2007年,ATI引入了自定義過濾器抗鋸齒(CFAA)[1625],能夠使用稍微延伸到其他畫素單元的窄和寬的tent過濾器。此後,此模式已被EQAA支援所取代。在現代GPU上,畫素或計算著色器可以訪問MSAA樣本並使用所需的任何重建過濾器,包括從周圍畫素樣本中取樣的過濾器。更寬的過濾器可以減少混疊,但會丟失銳利的細節。Pettineo[1402,1405]發現,濾波器寬度為2或3畫素的三次*滑步長和B樣條濾波器總體上給出了最好的結果。還有效能成本,因為即使使用自定義著色器模擬預設box過濾器解析也需要更長的時間,並且更寬的過濾器核心意味著增加樣本訪問成本。
NVIDIA的內建TXAA支援類似地在比單個畫素更廣的區域上使用更好的重建過濾器,以提供更好的結果。它和較新的MFAA(多幀抗鋸齒)方案都還使用時間抗鋸齒 (TAA),這是一種使用先前幀的結果來改善影像的通用技術。在某種程度上,由於允許程式設計師設定每幀的MSAA取樣模式[1406]的功能,這種技術成為可能。此類技術可以解決諸如旋轉車輪之類的鋸齒問題,還可以提高邊緣渲染質量。
想象一下,通過生成一系列影像來“手動”執行取樣模式,其中每個渲染使用畫素內的不同位置進行取樣。這種偏移是通過在投影矩陣[1938]上附加一個微小的*移來完成的。一起生成和*均的影像越多,結果就越好。這種使用多個偏移影像的概念用於時間抗鋸齒演算法。可能使用MSAA或其他方法生成單個影像,然後將之前的影像混合在一起。通常只使用兩到四幀[382,836,1405]。較舊的影像的權重可能會成倍減少[862],儘管如果觀看者和場景不移動,這可能會產生幀閃爍的效果,因此通常只對最後一幀和當前幀進行相等的加權。由於每一幀的樣本位於不同的子畫素位置,這些樣本的加權和提供了比單幀更好的邊緣覆蓋率估計。因此,使用最新的兩幀*均在一起的系統可以提供更好的結果。每幀都不需要額外的樣本,這就是這種方法如此吸引人的原因。甚至可以使用時間取樣來生成解析度較低的影像,並將其放大到顯示器的解析度[1110]。此外,需要大量樣本才能獲得良好結果的照明方法或其他技術可以改為每幀使用更少的樣本,因為結果將在多個幀上混合[1938]。
雖然在不增加取樣成本的情況下為靜態場景提供抗鋸齒,但這種型別的演算法在用於時間抗鋸齒時存在一些問題。如果幀的權重不均等,則靜態場景中的物件可能會出現微光。快速移動的物件或快速的相機移動可能會導致重影,即由於先前幀的貢獻而在物件後面留下的痕跡。鬼影的一種解決方案是僅對緩慢移動的物件執行這種抗鋸齒[1110]。另一個重要的方法是使用重投影(第12.2節)來更好地關聯前一幀和當前幀的物件。在這樣的方案中,物件生成儲存在單獨的“速度緩衝區”中的運動向量(第12.5節)。這些向量用於將前一幀與當前幀相關聯,即從當前畫素位置減去該向量以找到該物件表面位置的前一幀顏色畫素。樣本不太可能是當前幀中表面的一部分被丟棄[1912]。由於時間抗鋸齒不需要額外的樣本,因此額外的工作相對較少,*年來這種演算法引起了強烈的興趣和廣泛採用。這種關注部分是因為延遲著色技術(第20.1節)與MSAA和其他多重取樣支援不相容[1486]。方法各不相同,並且根據應用程式的內容和目標,已經開發了一系列避免偽影和提高質量的技術[836,1154,1405,1533,1938]。例如,Wihlidal的簡報[1885]展示了應用於棋盤取樣模式的EQAA、時間抗鋸齒和各種過濾技術如何結合起來以保持質量,同時降低畫素著色器呼叫的數量。伊格萊西亞斯-吉蒂安等人[796]總結了以前的工作並提出了他們的方案,以使用畫素歷史和預測來最小化過濾偽影。帕特尼等人[1357]擴充套件了Karis和Lottes在虛幻引擎4實現[862]上的TAA工作,以用於虛擬現實應用程式,新增可變大小的取樣以及對眼球運動的補償(第21.3.2節)。
取樣模式
有效的取樣模式是減少混疊、時間和其他方面的關鍵因素。Naiman[1257]表明,人類最容易受到*水*和*垂直邊緣上的混疊的干擾。其次是傾斜度接*45度的邊緣。旋轉網格超級取樣(RGSS)使用旋轉的方形圖案在畫素內提供更高的垂直和水*解析度。圖5.25顯示了這種模式的一個示例。
RGSS模式是拉丁超立方體或N-rooks取樣的一種形式,其中n個樣本放置在n×n網格中,每行和每列一個樣本[1626]。使用RGSS,四個樣本分別位於4×4子畫素網格的單獨行和列中。與常規的2×2取樣模式相比,此類模式特別適用於捕獲幾乎水*和垂直的邊緣,其中此類邊緣可能覆蓋偶數個樣本,因此提供的有效級別較少。
N-rooks是建立良好取樣模式的開始,但這還不夠。例如,樣本可能都位於子畫素網格的對角線上,因此對於幾乎*行於該對角線的邊緣給出了較差的結果。參見圖5.27。為了更好的取樣,我們希望避免將兩個樣本放在一起。我們還想要一個均勻的分佈,將樣本均勻地分佈在該區域上。為了形成這樣的模式,分層抽樣技術(如拉丁超立方抽樣)與其他方法(如抖動、Halton序列和泊松盤抽樣)相結合[1413,1758]。
圖5.27. N-rooks取樣。左邊是一個合法的N-rooks模式,但它在捕獲沿其線對角線的三角形邊緣方面表現不佳,因為隨著該三角形的移動,所有樣本位置都將位於三角形內部或外部。 右邊是一個模式,可以更有效地捕捉這個邊緣和其他邊緣。
在實踐中,GPU製造商通常將此類取樣模式硬連線到他們的硬體中,以進行多重取樣抗鋸齒。圖5.28顯示了一些實際使用的MSAA模式。對於時間抗鋸齒,覆蓋模式是程式設計師想要的,因為樣本位置可以逐幀變化。例如,Karis[862]發現基本Halton序列比GPU提供的任何MSAA模式效果更好。Halton序列在空間中生成的樣本看起來是隨機的,但差異很小,也就是說,它們在空間上分佈良好,沒有一個是聚類的[1413,1938]。
圖5.28. AMD和NVIDIA圖形加速器的MSAA 取樣模式。綠色方塊是著色樣本的位置,紅色方塊是計算和儲存的位置樣本。從左到右:2×、4×、6×(AMD)和8×(NVIDIA)取樣。(由 D3D FSAA 檢視器生成。)
雖然亞畫素網格模式可以更好地*似每個三角形如何覆蓋網格單元,但它並不理想。一個場景可以由螢幕上任意小的物體組成,這意味著沒有任何取樣率可以完美地捕捉它們。如果這些微小的物體或特徵形成圖案,則以恆定間隔進行取樣會導致莫爾條紋和其他干涉圖案。超級取樣中使用的網格模式特別容易混疊。
一種解決方案是使用隨機抽樣,它提供了更隨機的模式。像圖5.28中的那些模式當然是合格的。想象一下遠處有一把細齒梳子,每個畫素都有幾顆梳齒。當取樣模式與梳齒頻率同相和異相時,規則模式會產生嚴重的偽影。具有較少有序的取樣模式可以打破這些模式。隨機化傾向於用噪聲代替重複的混疊效應,人類視覺系統對此更加寬容[1413]。結構較少的模式會有所幫助,但在逐個畫素重複時仍會出現混疊。一種解決方案是在每個畫素處使用不同的取樣模式,或者隨時間改變每個取樣位置。交錯取樣索引取樣交錯,其中一組的每個畫素具有不同的取樣模式,在過去的幾十年中偶爾在硬體中得到支援。例如,ATI的SMOOTHVISION允許每個畫素最多16個樣本和最多16種不同的使用者定義的取樣模式,這些模式可以混合在重複模式中(例如,在4×4畫素塊中)。Molnar[1234]以及Keller和Heidrich[880] 發現,使用交錯隨機取樣可以最大限度地減少對每個畫素使用相同模式時形成的混疊偽影。
其他一些GPU支援的演算法值得注意。一種讓樣本影響多個畫素的實時抗鋸齒方案是NVIDIA較舊的Quincunx方法[365]。 “Quincunx”是指五個物體的排列,四個在一個正方形中,第五個在中心,例如六面骰子上的五個點的圖案。Quincunx 多重取樣抗鋸齒使用這種模式,將四個外部樣本放在畫素的角點。請參見圖5.25。每個角點樣本值分佈到其四個相鄰畫素。中心樣本的權重為\(\frac{1}{2}\) ,而每個角落樣本的權重為\(\frac{1}{8}\),而不是對每個樣本進行同等加權(就像大多數其他實時方案所做的那樣)。由於這種共享,每個畫素*均只需要兩個樣本,結果明顯優於兩個樣本FSAA 方法[1678]。這種模式*似於二維tent過濾器,如上一節所述,優於box過濾器。
Quincunx取樣也可以通過每個畫素使用單個樣本來應用於時間抗鋸齒[836,1677]。每幀在每個軸上從前一幀偏移半個畫素,偏移方向在幀之間交替。前一幀提供畫素角樣本,雙線性插值用於快速計算每個畫素的貢獻。結果是當前幀的*均值。每幀的權重相等意味著靜態檢視沒有閃光偽影。對齊移動物件的問題仍然存在,但該方案本身編碼簡單,並且在每幀每個畫素僅使用一個樣本時提供了更好的外觀。
在單幀中使用時,Quincunx通過在畫素邊界共享樣本得到了很低的成本,只有兩個樣本。RGSS圖案更擅長捕捉更多接*水*和垂直邊緣的漸變。FLIPQUAD模式最初是為移動圖形開發的,它結合了這兩個理想的特徵[22]。它的優點是成本僅為每個畫素兩個樣本,質量類似於RGSS(每個畫素成本四個樣本)。這種取樣模式如圖5.29所示。Hasselgren等人探索了其他利用樣本共享的廉價取樣模式[677]。
圖5.29. 左側顯示了RGSS取樣模式。這需要每個畫素四個樣本。通過將這些位置移到畫素邊緣,可以跨邊緣進行樣本共享。然而,為了解決這個問題,每個其他畫素都必須有一個反射樣本圖案,如右圖所示。生成的樣本模式稱為 FLIPQUAD,每個畫素需要兩個樣本。
與Quincunx一樣,雙樣本FLIPQUAD模式也可以與時間抗鋸齒一起使用並分佈在兩個幀上。Drobot[382,383,1154]解決了在他的混合重建抗鋸齒 (HRAA) 工作中哪種雙樣本模式最好的問題。他探索了時間抗鋸齒的不同取樣模式,發現FLIPQUAD模式是五種測試模式中最好的。棋盤模式也被用於時間抗鋸齒。El Mansouri[415]討論了使用兩個樣本的MSAA來建立棋盤渲染以降低著色器成本,同時解決混疊問題。Jimenez[836]使用SMAA、時間抗鋸齒和各種其他技術來提供一種解決方案,其中抗鋸齒質量可以響應渲染引擎負載而改變。Carpentier和Ishiyama[231]在邊緣取樣,將取樣網格旋轉45°。他們將這種時間抗鋸齒方案與FXAA(稍後討論)相結合,以有效地在更高解析度的顯示器上進行渲染。
形態學方法
鋸齒通常是由邊緣引起的,例如由幾何形狀、銳利陰影或明亮高光形成的邊緣。可以利用鋸齒具有與之結構相關的知識來提供更好的抗鋸齒結果。2009年,Reshetov[1483]提出了一種演算法,稱為形態學抗鋸齒 (MLAA)。“形態學”的意思是“與結構或形狀有關”。早在1983年,Bloomenthal[170]就已在該領域[830]進行了早期工作。Reshetov的論文重啟了對多重取樣方法替代方案的研究,強調搜尋和重建邊緣[1486]。
這種形式的抗鋸齒是作為後處理執行的。也就是說,以通常的方式進行渲染,然後將結果饋送到生成抗鋸齒結果的程式。自2009年以來,已經開發了廣泛的技術。那些依賴於額外緩衝區(例如深度和法線)的技術可以提供更好的結果,例如亞畫素重建抗鋸齒 (SRAA) [43,829],但隨後僅適用於幾何邊緣的抗鋸齒。分析方法,例如幾何緩衝區抗鋸齒(GBAA)和距離到邊緣抗鋸齒(DEAA),讓渲染器計算有關三角形邊緣所在位置的附加資訊,例如,邊緣距畫素中心的距離[829]。
最通用的方案只需要顏色緩衝區,這意味著它們還可以改善陰影、高光或各種先前應用的後處理技術的邊緣,例如輪廓邊緣渲染(第15.2.3節)。例如,定向區域性抗鋸齒 (DLAA)[52,829]是基於這樣的觀察,即幾乎垂直的邊緣應該水*模糊,同樣接*水*的邊緣應該與其鄰居垂直模糊。
更精細的邊緣檢測形式試圖找到可能包含任何角度邊緣的畫素並確定其覆蓋範圍。檢查潛在邊緣周圍的鄰域,目的是儘可能重建原始邊緣所在的位置。然後可以使用邊緣對畫素的影響來混合相鄰畫素的顏色。有關該過程的概念檢視,請參見圖5.30。
圖5.30. 形態學抗鋸齒。左側是鋸齒影像。目標是確定形成它的邊緣的可能方向。在中間,該演算法通過檢查領域來記錄邊緣的可能性。給定樣本,顯示了兩個可能的邊緣位置。在右側,最佳猜測邊緣用於將相鄰顏色與估計的覆蓋率成比例地混合到中心畫素中。對影像中的每個畫素重複此過程。
Iourcha等人[798]通過檢查以畫素為單位的MSAA樣本來改進邊緣查詢,以計算更好的結果。請注意,邊緣預測和混合可以提供比基於樣本的演算法更高精度的結果。例如,每畫素使用四個樣本的技術只能為物件邊緣提供五個級別的混合:不覆蓋樣本、覆蓋一個、兩個、三個和四個。估計的邊緣位置可以有更多位置,因此可以提供更好的結果。
基於影像的演算法有幾種誤入歧途的方式。首先,如果兩個物件之間的色差低於演算法的閾值,則可能無法檢測到邊緣。三個或更多不同表面重疊的畫素很難解析。具有高對比度或高頻元素的表面,顏色在畫素之間快速變化,可能會導致演算法丟失邊緣。特別是,當對其應用形態抗鋸齒時,文字質量通常會受到影響。物件角可能是一個挑戰,一些演算法賦予它們圓潤的外觀。曲線也可能受到邊緣是直的假設的不利影響。單個畫素的變化會導致邊緣重建方式發生很大變化,這可能會在幀與幀之間產生明顯的偽影。改善這個問題的一種方法是使用MSAA覆蓋掩碼來改進邊緣確定[1484]。
形態抗鋸齒方案僅使用提供的資訊。例如,寬度小於畫素的物件(例如電線或繩索)將在螢幕上出現間隙,只要它沒有恰好覆蓋畫素的中心位置。在這種情況下,採取更多的樣本可以提高質量;僅基於影像的抗鋸齒不能。此外,執行時間可以根據檢視的內容而變化。例如,一片草地的抗鋸齒時間可能是天空檢視的三倍 [231]。
儘管如此,基於影像的方法可以為適度的記憶體和處理成本提供抗鋸齒支援,因此它們被用於許多應用程式中。僅顏色版本也與渲染管道分離,使其易於修改或禁用,甚至可以作為GPU驅動程式選項公開。兩種最流行的演算法是快速*似抗鋸齒(FXAA)[1079,1080,1084]和亞畫素形態抗鋸齒(SMAA)[828,830,834],部分原因是兩者都為各種機器提供了可靠的(和免費的)原始碼實現。兩種演算法都使用純顏色輸入,SMAA具有能夠訪問MSAA樣本的優勢。每個都有自己的各種可用設定,在速度和質量之間進行權衡。成本通常在每幀1到2毫秒的範圍內,主要是因為這是視訊遊戲願意花費的。最後,這兩種演算法還可以利用時間抗鋸齒[1812]。Jimenez[836]提出了一種改進的SMAA實現,比FXAA更快,並描述了一種時間抗鋸齒方案。最後,我們建議讀者閱讀Reshetov和Jimenez[1486]對形態學技術及其在視訊遊戲中的應用的廣泛評述。