Anti alias的前世今生(一)

2022-05-17 16:44:07 字數 1878 閱讀 8184

anti-alias,簡稱aa,在圖形學中廣泛地用於提公升渲染質量。經過幾十年的發展,aa也從離線渲染逐步普及到了實時渲染的領域。本系列文章將總結一下在實時渲染中使用的aa方法的前世和今生。本片集中討論硬體提供的aa方法。

圖1. 乙個畫素內部的取樣點。16個紅圈表示16個取樣點,藍色和黃色是覆蓋了這個畫素的兩個三角形。

super sampling anti-aliasing是最直觀的一種aa方法。實現方法之一就是渲染乙個大圖,然後downsample,這相當於在每個最終畫素內部做了乙個均勻 分布取樣。更通用的描述是,每個畫素分布多個取樣點(可以均勻分布、poisson分布、隨機分布、抖動分布等),每個取樣點都有獨立的color和 depth,pixel shader在每個取樣點都執行一遍。如圖1的情況,會得到1個白色,1個淺藍色和14個黃色的取樣點。最後這個畫素的值是這16個取樣點的平均,也就是 ((1, 1, 1) +  (0.77, 0.77, 1) + 14 * (1, 1, 0)) / 16 = (0.98, 0.98, 0.125)。在這些方法中,ssaa質量最好,畢竟是個最暴力的方法。在d3d 10.1+上可以選擇per-sample或者per-pixel執行pixel shader,也就是直接支援了ssaa。

效能統計(取樣數為n,下同):每個畫素裡ps執行次數為n,占用空間n個color + n個depth。

ssaa需要在每個取樣點都執行一次ps並儲存color和depth,時間和空間開銷都是驚人的。multi-sampling anti-aliasing的出現極大地改善了這點。msaa在每個畫素只執行一次ps,輸出顏色寫入所有通過depth-stencil測試的取樣本 中。在shader model 3之前,ps的輸入一定取自畫素的中心;後來加入了centric插值,ps的輸入屬性就可以是三角形所覆蓋的所有取樣點的中心:

來自如圖1的情況,沒有centric插值的話,藍色三角形的兩個取樣點將都得到純藍的顏色(外差而得),最終畫素的顏色就是(2 * (0, 0, 1) + 14 * (1, 1, 0)) / 16 = (0.875, 0.875, 0.125)。有centric插值的話就是個更正確的淺藍色((1, 1, 1) + (0.77, 0.77, 1)) / 2 = (0.885, 0.885, 1),最終畫素顏色是(2 * (0.885, 0.885, 1) + 14 * (1, 1, 0)) / 16= (0.98, 0.98, 0.125)。如下圖所示:

效能統計:每個畫素裡ps執行次數為每個覆蓋到該畫素的三角形一次,占用空間n個color + n個depth。

msaa雖然解決了計算的問題,但儲存量還是很大,尤其是取樣率到了8以上。nvidia在g80及以上的gpu增加了coverage sampling anti-aliasing的方法。csaa解耦了color/depth的buffer和coverage的buffer,可以用較少的color /depth空間來儲存原先高取樣數才能得到的質量。比如圖1的情況,用csaa 16x來渲染,就會把乙個畫素分成左上、右上、左下和右下4塊區域,每塊區域有4個coverage取樣點,但共享同乙個color和depth。對於圖 1的情況,結果就是,(0.25 * (0.885, 0.885, 1)  + 0.25 * (0.885, 0.885, 1) + 3.75 * (1, 1, 0)) / 4 = (0.98, 0.98, 0.125)。

效能統計:每個畫素裡ps執行次數為每個覆蓋到該畫素的三角形一次,占用空間m個color + m個depth,m小於n。

這三種方法是常見的硬體直接支援的aa方法,下篇文章將講述各種基於post process的aa方法。

LinkedList前世今生

1 linkedlist元素在內部儲存的實現,節點定義即指向前一元素的指標,後一元素的指標,當前元素的值。private static class entry 2 建立乙個空鍊錶。預設有個頭指標header。private transient entryheader new entry null,n...

前世今生 STL

嘛,string就是乙個用於字串處理的標準類庫,但是需要注意的是其速度可能會比直接操縱char陣列要慢一些。reverse這個方法是我一直都想找到但是沒有找到的,在判斷回文的時候格外好用。string s abcdef string ss s ss abcdef reverse ss.begin s...

位址 前世今生

alu arithemetic and logic unit 書面意思是 算術與邏輯部件,運算器,算術與邏輯單元,通俗來講 cpu處理的資料位數。從4位 8位 16位 32位,處理能力越來越強。發問 16位計算能力如何處理20位的位址呢?cs ip 是一組暫存器,用於告知 cpu 當前將要讀取的彙編...