圖形學中的貼圖取樣、走樣與反走樣等,圖形學走樣
計算機圖形學中不可避免的會涉及到影象分析與處理的相關知識,前些時間也重溫了下常用到的取樣、重建以及紋理貼圖等內容,並對其中的走樣與反走樣有了更多的認識,這裡小結一下。
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)(可能)如下圖所示:
圖中的橫軸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函式如下圖所示:
利用濾波函式進行頻域和空間域的重建操作如下所示:
從上述關於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,其對應的空間域及頻域函式波形圖如下:
將其應用到重建函式中可以看出:其對於目標點的估值只會使用若干取樣點中的一個,而並沒有採用多個取樣點之間的插值,因而重建效果較差,最終會得到如下圖所示的階梯狀波形(稱之為鋸齒邊緣或Jagged Edges)。
4.2 Triangle Filter
該濾波器的函式形式如下所述:
其也被稱為Tent Filter,其對應的空間域及頻域函式波形圖如下:
相對來說,其重建效果會比Box Filter要好(如下圖所示),但其中的鋸齒邊緣依然明顯,這主要是由於該Filter對取樣點之間的插值力度仍然不夠所致。對應的H(f)對超過fmax的高頻部分抑制力度不夠所致。
4.3 Cubic Convolution
該濾波器是以一種三階多項式的方法來對sinc函式進行近似,效果蠻不錯,而且還可以暴露出引數以供效果調節。其形式如下:
從圖中可以看出,相對於前兩種濾波器,使用Cubic濾波器可以明顯地減少重建訊號中的鋸齒規模與數量,這主要是由於其對取樣點之間採用了更高階的插值計算,因而效果相對更好。
4.4 Windowed Sinc Function
這裡回過頭來再看理想的空間域sinc濾波函式,其最重要的應用障礙就是其中對無限多相鄰取樣點的累積,反映在空間域sinc函式上則是曲線向橫軸兩側的無限延伸;因而,如果可以去掉其在空間域中向兩側的延伸部分(相當於對sinc函式進行濾波,過濾其中空間位置較大的部分),則其近似的sinc函式就變得應用可行。該方法與頻域空間中的濾波(施加H(f) 的影響)類似,只不過這裡是在空間域上對sinc函式施加一個視窗過濾操作,最終只使用視窗內(含有限個取樣點)的修正sinc函式。
常見的幾種空間域sinc視窗函式如下:
4.4.1 Hann Hamming
該視窗函式形式如下所述:
其中的N用來控制視窗中取樣點的數量,a 用來控制視窗函式曲線的外形。對應的函式形狀如下:
從可以看出,最終得到的H(f)函式質量比前述幾種非sinc視窗型別的要更好。
4.4.2 Blackman
該視窗函式形式如下所述:
其中的N同樣為視窗中的取樣點數量,只不過這裡相對於H&H少了一個可控的引數。對應的函式形狀如下:
4.4.3 Lanczos
該視窗函式形式如下所述:
其中的n用來控制視窗過濾域的範圍。對應的函式形狀如下(其中的n = 2):
在應用中,將這些視窗函式施加於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手段解決了紋理貼圖中的走樣現象,且效果較好。