圖形學中的貼圖採樣、走樣與反走樣等,圖形學走樣
電腦圖形學中不可避免的會涉及到映像分析與處理的相關知識,前些時間也重溫了下常用到的採樣、重建以及紋理貼圖等內容,並對其中的走樣與反走樣有了更多的認識,這裡小結一下。
1. 基本問題訊號的採樣與重建過程中首先面臨著兩個基本的問題:
- 給定一個連續的訊號g(x)以及它的離散採樣訊號gs(x),能否通過gs(x)來完整的描述g(x) 的資訊;
- 如果可以,如何通過gs(x)來重建出原始訊號g(x)。
這些通過對資訊進行頻域的分析即可得到相應的結論。
2. 採樣
將一處於空間域(或時域)內的訊號向頻域進行轉換,可以使用傅立葉變換(Fourier Transformation)來實現。給定空間域訊號為g(x),其對應的頻域訊號為G(f),則其對應的傅立葉變換關係為:
其中的x 表示相應的空間位置,f 表示對應的頻率。原始訊號g(x)對應的頻域空間中的函數G(f)(可能)如所示:
頻域G(f)
圖中的橫軸f 表示相應的頻率,越往兩端對應的頻率越大。其中可以看出,G(f) 的有效值主要限定於頻率|fmax|之內,其餘頻率位置上均為0,對於這樣的情況可以稱G(f)是帶限(bandlimited)於fmax 的。這是訊號採樣與重建中一個較為重要的屬性。
對原始訊號g(x)進行採樣得到離散採樣訊號gs(x),採樣的過程主要是通過一個基於脈衝函數的脈衝採樣器來實現,其表述如下所示:
其中的Ts就是採樣周期。在s(x) 下就可以得到原始訊號與採樣訊號之間的關係:
為了更方便的觀察gs(x)的一些屬性,可以將其轉換到頻域空間內進行分析,這裡可以藉助傅立葉變換中的幾個重要屬性:
- 函數在空間域(或時域)內的乘積對應於它們在頻域空間內的卷積:
- 累積脈衝函數的傅立葉變換的特殊形式(證明可見這裡):
利用這些屬性就可以推導gs(x)的頻域函數Gs(f) 如下:
從推導結果的運算式中可以看出:Gs(f)中包含了完整的原始訊號G(f) 的資訊;Gs(f)的值相對於原始G(f) 有作相應比例的縮放;另外,其以fs 為周期對G(f) 進行了全頻空間上的疊加。最終,Gs(f) 對應的頻域空間函數波形如所示:
3. 重建
通過上述對Gs(f) 的頻域分析後發現,可以用另外一種形式來表述G(f)與Gs(f) 之間的關係:
其中的Ghigh(f) 表示在|fmax|之外的較高頻率上對G(f)進行疊加的部分。如此一來,通過使用某種手段去除其中的超過頻率|fmax|的疊加部分之後就可以從Gs(f)實現對原始訊號的還原,即重建。
但是在某些情況下,並不能從Gs(f)中完整地分離出G(f)與Ghigh(f)部分,這樣的話就無法濾去其中的高頻部分得到原始訊號,因而可以實現重建的訊號採樣需要滿足下述條件才可:
- 原始訊號必須是帶限的。通過Gs(f)的頻域函數圖可以看出,如果原始訊號不是帶限的(即G(f)向兩端無限擴充),則必然會出現G(f)和\Ghigh(f)兩個波譜之間的相互交疊;這樣就無法完整還原出原始訊號。
- 採樣頻率必須是原始訊號最大頻率fmax 的2倍(Nyquist rate)。同樣通過Gs(f) 的頻域函數圖可以看出,如果採樣頻率fs 過低,也會造成兩側的Ghigh(f)與G(f)的交疊,進而導致無法還原。
3.1 理想頻域濾波函數
如果有了滿足重建條件的採樣訊號,也即上述分離運算式可行時,如何從中分離出目標G(f)即成為一個比較簡單的問題。只需要根據\(f_{max}\)的分布,構造一個頻域中形如下式的函數,並將其施加於Gs(f) 即可:
這裡的\(H(f)\)被稱理想低通濾波器(Ideal Low-pass Filter),因為它可以完整地從Gs(f) 中分離出G(f)部分而不會帶來雜訊或訊號的損失。將H(f) 施加到Gs(f) 上的情形如所示(表現為頻域空間中兩個函數的乘積):
頻域中通過向Gs(f) 施加H(f) 來濾出其中的G(f) 部分
3.2 理想空間域濾波函數
將上述頻域中的理想低通濾波函數向空間域進行傅立葉逆變換即可得到對應的空間域理想濾波函數,該函數也被稱為sinc函數,其形式如下:
空間域中的sinc函數如所示:
Sinc函數
利用濾波函數進行頻域和空間域的重建操作如下所示:
從上述關於g(x) 的運算式中可以看出,使用sinc函數來重建g(x) 時需要計算當前採樣點周圍無限多個相鄰採樣點的累積,這種計算在實際應用中當然是不可行的。因而這裡的理想濾波函數sinc就不能被直接應用,這於是就引出了非理想濾波函數。
3.3 非理想濾波函數下的重建
非理想的濾波函數並不能像sinc函數那樣完全濾去Gs(f) 中的高頻Ghigh(f) 部分,而是一定程度上有所保留;同時,也不能完全保留其中的目標低頻G(f) 部分,而是一定程度上有所損失。但整體上,非理想的濾波函數可以以一種可行的方案來實現對原始訊號在可接受程度上的重建。頻域上的一個非理想濾波函可能如所示:
其中的Hr(f)即為非理想的頻域濾波函數:其在|fmax|內部的部分並不能完全地還原出G(f),而是在接近|fmax|處有所損失(曲線向下導致);同時,在到達|fmax|後並沒有截止而是繼續向外擴充,這樣就在結果中引入了頻率超過|fmax|的高頻部分。
在空間域上,使用非理想的濾波函數來實現重建則是通過在目標點周圍施加一個一定尺寸(維度不一定)的Kernel並累積其中的有限採樣點(對比sinc中的無限)來完成。其形式一般如下所示:
上式就表示在目標點x 周圍通過K個採樣點、在重建核心h(x)下(具現為權重)實現對當前點的訊號估值。
4. 重建Kernel由上述對於空間域內重建函數的分析可以看出,在經由採樣點對訊號進行重建的過程中,重建核心的設計至關重要。在實踐中經常使用的重建核心主要有以下幾種:
4.1 Box Filter
該濾波器的函數形式如下所述:
這是最簡單的一種Filter,其對應的空間域及頻域函數波形圖如下:
Box Filter
將其應用到重建函數中可以看出:其對於目標點的估值只會使用若干採樣點中的一個,而並沒有採用多個採樣點之間的插值,因而重建效果較差,最終會得到如所示的階梯狀波形(稱之為鋸齒邊緣或Jagged Edges)。
Box濾波器重建效果
4.2 Triangle Filter
該濾波器的函數形式如下所述:
其也被稱為Tent Filter,其對應的空間域及頻域函數波形圖如下:
Triangle Filter
相對來說,其重建效果會比Box Filter要好(如所示),但其中的鋸齒邊緣依然明顯,這主要是由於該Filter對採樣點之間的插值力度仍然不夠所致。對應的H(f)對超過fmax的高頻部分抑制力度不夠所致。
Triangle濾波器重建效果
4.3 Cubic Convolution
該濾波器是以一種三階多項式的方法來對sinc函數進行近似,效果蠻不錯,而且還可以暴露出參數以供效果調節。其形式如下:
Cubic Filter
Cubic濾波器重建效果
可以看出,相對於前兩種濾波器,使用Cubic濾波器可以明顯地減少重建訊號中的鋸齒規模與數量,這主要是由於其對採樣點之間採用了更高階的插值計算,因而效果相對更好。
4.4 Windowed Sinc Function
這裡回過頭來再看理想的空間域sinc濾波函數,其最重要的應用障礙就是其中對無限多相鄰採樣點的累積,反映在空間域sinc函數上則是曲線向橫軸兩側的無限延伸;因而,如果可以去掉其在空間域中向兩側的延伸部分(相當於對sinc函數進行濾波,過濾其中空間位置較大的部分),則其近似的sinc函數就變得應用可行。該方法與頻域空間中的濾波(施加H(f) 的影響)類似,只不過這裡是在空間域上對sinc函數施加一個視窗過濾操作,最終只使用視窗內(含有限個採樣點)的修正sinc函數。
常見的幾種空間域sinc視窗函數如下:
4.4.1 Hann Hamming
該視窗函數形式如下所述:
其中的N用來控制視窗中採樣點的數量,a 用來控制視窗函數曲線的外形。對應的函數形狀如下:
Hann&Hamming視窗函數
從可以看出,最終得到的
H(f)函數品質比前述幾種非sinc視窗類別型的要更好。
4.4.2 Blackman
該視窗函數形式如下所述:
其中的N同樣為視窗中的採樣點數量,只不過這裡相對於H&H少了一個可控的參數。對應的函數形狀如下:
Blackman視窗函數
4.4.3 Lanczos
該視窗函數形式如下所述:
其中的n用來控制視窗過濾域的範圍。對應的函數形狀如下(其中的n = 2):
Lanczos視窗函數
在應用中,將這些視窗函數施加於sinc函數上,即可得到近似於sinc函數效果的視窗濾波函數,進而實現更好的映像訊號重建。
5. 走樣與反走樣5.1 走樣原因
在前面介紹了使用採樣訊號來完全重建原始訊號所需的兩個基本條件:1. 原始訊號是帶限的;2. 採樣頻率要滿足Nyquist頻率。如果這兩個條件中有任一條不被滿足則即便是使用理想的低通 濾波器也不可能完全重建出原始訊號,這種情況下的現象就稱為走樣(Aliasing)。
對於圖形學中的映像渲染而言,Nyquist率是由可像素化顯示的最高頻率決定,也即為2 pixels / cycle(兩個像素間有一個非像素間隔),對應的頻率則為0.5,因而fmax=1,這也就對應:無走樣渲染時的採樣最低頻率不應該小於1。一個明顯的例子就是後處理中常見的案例:將一個N X N大小的緩衝區紋理貼到一個螢幕空間中N X N的Quad上渲染時並不會有走樣,因為其採樣頻率滿足Nyquist要求。
另外,也要區分走樣與鋸齒之間的差異,兩者在圖形學中易被混淆(這主要是由於映像渲染時的走樣也常常具化為鋸齒現象)。鋸齒主要是由於重建Kernel不夠好,進而使得在重建訊號中出現了插值不平滑的情況,但是如果在其採樣訊號上施加一個理想的重建Kernel時則還是可以完全地還原出原始訊號(比如紋理貼圖中的Magnification);反之,走樣則是由於不滿足訊號重建的兩個基本條件,這樣即使在其採樣訊號上使用理想的重建Kernel也不能夠重建出原始訊號。通過其中的差異可以看出:鋸齒現象可以通過一些Blur演算法來加以消除,但走樣卻不行。
5.2 反走樣方法
當採樣不滿足上述重建的基本條件時就會產生走樣,而針對走樣產生的原因,通過各種方法與途徑來消除走樣的產生即是反走樣。通常來說,一般的映像訊號均是帶限的,但是其卻可能限制於一個較大的fmax,進而導致第二個條件難以達到,因而兩個條件是相關的。根據走樣的來源,就可以有兩種方法來實現反走樣:
- 在原始訊號的帶限上做處理。該方法主要是在採樣前對訊號進行一些預濾波(Prefiltering)處理來修改原始訊號的帶限,比如同樣使用一個低通濾波器來將原始訊號的帶限降到一個更低的範圍,這樣的話就可以使重建的第二個條件更容易滿足。
- 在採樣頻率上做處理。該方法就是直接增大採樣的頻率來使其儘可能地滿足第二個重建條件。
其中第二種方法雖然比較直接,但其應用場合卻有所限制,比如向一個螢幕固定像素數量的地區渲染映像時無法增大其對應的採樣頻率,這時就只能使用Prefiltering的方法來實現反走樣。這裡需要注意Prefiltering的操作是在採樣之前進行的。
5.3 Prefiltering方法的幾個應用
5.3.1 Edge Antialiasing
基於Prefiltering方法的邊緣反走樣主要是利用Area sampling的手段來實現。該方法將目標輸出像素與原始映像訊號中的一個子領域對應,可以稱此地區為preimage。然後用一個低通濾波器來對該子領域進行濾波,如下所示:
這樣就可以整體降低映像資料來源的帶限,進而達到反走樣的目的。基於此方法的應用有很多,比如像Supersampling, Multisampling等。首先,經過GPU硬體管線渲染後得到一個比螢幕解析度大的顏色緩衝區,然後將目標輸出點與顏色緩衝區中的一個子領域對應(子領域中的像素分布可能並不是規則的),如所示。然後對該子領域中的像素做低通濾波操作來降低緩衝區映像訊號的帶限,之後將結果輸出到螢幕像素中即可實現反走樣。
5.3.2 Texture Antialiasing
紋理貼圖中的走樣主要產生在Minification時(如前所述的像素採樣頻率不足),針對這種走樣最常用的操作也是Prefiltering方法,典型應用就是Mipmap。Mipmap方法是在紋理貼圖產生時,計算出個幾不同Level的子貼圖,比如第0級對應N X N大小,第1級對應N/2 X N/2大小,等等;當前級中的像素由上一級相關位置上的四個像素來決定。這樣,每個Level的子貼圖也就對應著不同的帶限,在實際使用時通過Level選擇演算法定位到合適的貼圖層級,使得貼圖渲染時的採樣頻率滿足Nyquist條件,進而達到反走樣的目的。
Mipmap
使用Mipmap需要預先產生原始貼圖在若干層級下的子貼圖,因而會帶來一定的額外空間佔用量(大約33%);同時,在使用時需要定位到合適的貼圖層級,這個計算過程也會比較複雜(也值得好好研究,不過還好,可以有API或硬體協助完成)。整體上來說,Mipmap方法以一種較經濟的Prefiltering手段解決了紋理貼圖中的走樣現象,且效果較好。