走樣與反走樣(Aliasing/Anti-Aliasing):Graphics Cases
上一篇文章(走樣與反走樣(Aliasing/Anti-Aliasing):Basics),我們介紹了信號採樣和重建的基本原理。通過傅里葉變換將時域信號變換到頻域信號,我們可以更深刻的分析信號的頻譜性質。由於採樣率過低或原始信號含有過高頻率的信息,經過採樣後頻譜信號會互相重疊而導致走樣。雖然sinc函數理論上可以用卷積運算完美重建原始信號,但是計算量巨大,實踐中往往採用更為簡單實用的filter kernel,這也會引起信號走樣。這兩類走樣又被稱為pre aliasing和post aliasing。
本篇文章則基於上述結論,分析圖像走樣和反走樣的一些實際例子。用信號處理理論分析圖像走樣的原因,可以幫助我們更深刻的理解走樣,有助於設計更好的反走樣方法。
圖像信號所屬空間稱為空域(Spatial Domain),是二維的。分析時域信號時使用的filter kernel是一維的,分析空域信號時使用的則是二維的。除了維數不同,分析時域信號使用的理論也適用於分析空域信號。
本文提到圖像處理的時候,是從一個實時渲染引擎程序員的角度去說的,可能會有不嚴謹的地方。
Case I: Texture Aliasing
真實物體表面的顏色是一個二維的連續函數。貼圖就是對這個二維函數的採樣。Texture Filtering可以看作對原始連續函數重新採樣的過程。
Texture Filtering有兩類操作:Magnification filtering和Minification filtering。這兩類操作都會導致走樣,但是走樣的原因是不同的(Texture filtering)。
對於Magnification filtering來說,一個紋素經過紋理映射應用到多於一個像素點上,走樣表現為近攝像機處格子邊緣的鋸齒。重新採樣原始連續函數得要生成更多的樣本,也就是說相對於貼圖,需要更高的採樣率。這時,反走樣的目標是恢復原始連續函數中的高頻信息,使用的是reconstruction filter。所以,類似sinc函數的filter kernel才是最佳的選擇。
而對於Minification filtering來說,貼圖中的信息細節太多了,相對於像素來說是高頻信息。走樣表現為遠攝像機處的大片噪點。這是由於相對於貼圖,遠攝像機處像素的採樣頻率過低,高頻信息轉換為低頻信息導致走樣。此時,重新採樣原始連續函數的目標是過濾掉高頻信息,使用的是pre filter,代價是圖像變得更模糊了。(https://graphics.cg.uni-saarland.de/fileadmin/cguds/courses/ws1516/cg1/slides/CG10-TextureFiltering.pdf)
攝像機視角對Minification filtering的效果有較大影響,會引入很多的計算量。理想的計算方式,是根據視角計算像素在貼圖上的足跡(footprint,如下圖),像素的顏色就是貼圖上這個足跡區域內顏色的積分。這個積分計算無法做到實時,實踐中只能計算近似值。經常使用的Mipmap就是為了近似計算做的預先處理。而Anisotropic filtering則是為了更逼近足跡區域形狀而做的進一步優化。(https://faculty.kaust.edu.sa/sites/markushadwiger/Documents/CS380_spring2015_lecture_12.pdf)
Case II: Geometry Aliasing
Geometry Aliasing是從保真物體幾何形狀的角度去分析的。任何導致物體幾何形狀信息丟失的現象都屬於Geometry Aliasing。下圖是兩種常見的幾何走樣現象。(http://groups.csail.mit.edu/graphics/classes/6.837/F03/lectures/23_aliasing.pdf)
左圖中,本來平滑的邊緣被繪製成了鋸齒狀;右圖中,部分幾何體信息丟失了,還有些形狀發生了較大的偏差。這都是由於屏幕的解析度不足、採樣率太低,丟失了場景中的高頻信息導致的。在光線追蹤演算法中,採樣率不僅和屏幕解析度有關,還和光線樣本的數量、分布等有密切關係。
Geometry Aliasing主要有三種應對方法:(反走樣技術(一):幾何反走樣)
1)超採樣。通過增加樣本數量儘可能保留高頻信息,然後再通過低通濾波轉換到和屏幕解析度一致。這是最直接有效的方法,但是計算量很大,存儲也有較大開銷。
增加樣本數量有很多種方法。人眼對於有固定規律(structure)的圖形非常敏感(比如鋸齒),而對於偶然出現或形狀不太規律(structureless)的形狀(又被稱為noise)沒那麼敏感。樣本如果都均勻分布,生成的圖像上就會呈現有固定規律的走樣圖像結構。所以,有很多研究都致力於合理分布樣本以將走樣轉換成噪點。(https://www.csie.ntu.edu.tw/~cyy/courses/rendering/16fall/lectures/handouts/chap07_sampling_4up.pdf, http://www.cs.umd.edu/~djacobs/CMSC427/Aliasing.pdf)
2)形態學的方法。深度和法線在幾何邊緣往往會有突變。構造合適的filter可以幫助識別這些結構,低通濾波器可以將鋸齒平滑。通常使用的FXAA演算法就屬此類。(文刀秋二:請問FXAA、FSAA與MSAA有什麼區別?效果和性能上哪個好?)
3)基於幀歷史的方法。此方法假設上下兩幀之間有較明顯的連續性,所以可以利用歷史幀信息變相增加採樣率,以提高當前幀圖像的生成質量。這類方法是近年來研究較活躍的領域。(Temporal Anti-Aliasing)
Case III: Shading Aliasing
Shading Aliasing的原因有兩個。一個是對渲染方程的採樣率不足。屏幕解析度和計算能力限制會導致採樣率不足。若物體表面的法線、材質、深度等信息的高頻部分未被採樣到,就會導致著色走樣。採樣率導致的走樣通常表現為圖像閃爍或大量噪點。
上述所提到的用於解決Geometry Aliasing的超採樣、基於幀歷史的方法,都同樣適用於解決Shading Aliasing。
採樣率不足的情況下,如果還使用point sampling,在繪製某些場景時可能出現Moire Pattern(http://www-cs.engr.ccny.cuny.edu/~wolberg/pub/crc04.pdf)。將point sampling換成area sampling(額外做一次低通濾波),可以減輕Moire條紋現象。
Shading Aliasing的第二個原因是像素點灰階資源有限導致的色彩失真(色彩校正中的 gamma 值是什麼?)。有限的灰度資源必須更多的投入到人眼敏感的低頻部分。
當然如果把色彩失真算作Shading Aliasing的話,或許渲染方程中各種hack和近似手段都應該算作Shading Aliasing的原因。
推薦閱讀: