《實時渲染》第四版中翻,第5.4節。
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底部):
\[\textrm{sinc}(x) = \frac{\textrm{sin}({\pi}x)}{{\pi}x} \tag{5.22}
\]
傅裡葉分析理論[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}\):
\[\textbf{p}(x,y) = \sum_{i=1}^{n}w_i\textbf{c}(i,x,y) \tag{5.23}
其中\(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]對形态學技術及其在視訊遊戲中的應用的廣泛評述。