多重采樣反走樣(MSAA)


多重采樣反走樣(Multisample anti aliasing)技術,簡稱MSAA,是實時渲染中解決抗鋸齒問題的一個常用方法。今天將對該算法的思想予以介紹。

Aliasing

想了解該算法的思想,就要首先明白鋸齒是如何產生的。渲染中的鋸齒又稱走樣(Aliasing),是渲染管線在進行光柵化時,由於屏幕像素的離散限制所產生的鋸齒狀邊緣。舉個例子,下圖使我們在渲染一個三角形:

對於每個像素,我們取它的中心點,根據中心點是否在三角形內來判斷該像素是否渲染三角形。以這種方式來渲染的話,渲染結果就如下圖所示:

可以看到,對於三角形的斜邊,因為屏幕像素並不是無限的,因此以這種方式渲染必然會出現鋸齒狀邊緣。這就是Aliasing。

SSAA

超采樣反走樣(SSAA)是一種支持抗鋸齒的方法。它的做法也很簡單:假設我們的屏幕像素為800600,那么我們只需要將渲染的texture擴大4倍(16001200),然后再把相鄰像素值做一個過濾(比如平均等)得到最終的圖像就可以解決這個問題了。利用該方法確實可以從根本上消除鋸齒,但是這種方法大大提高了存儲空間和計算量,所以一般不會使用這種技術。

MSAA

后來人們提出了多重采樣的方法。它的思路如下:
對於每個像素,不要僅用一個中間點來判斷三角形是否覆蓋,而是取4個頂點來分別判斷:

左圖是不采用MSAA的做法,那么這個像素就沒有被三角形所覆蓋。右圖用四個均勻分布的點來判斷,那么有兩個點就被三角形覆蓋了。
下圖是采用每像素4個點的三角形覆蓋判斷:

在具體的計算中,對於每個像素,fragment shader只需要算一次。對每個采樣點賦以顏色值,最終將四個采樣點的顏色平均就可以得到像素的顏色。如下圖所示:

這樣一來,就可以取到較好的抗鋸齒效果。計算量不會有太大變化,但是存儲量則要*4(因為多了四個采樣點,每個采樣點也要存顏色值)。
下圖展示了原始圖像和運用了MSAA的圖像,可以看到抗鋸齒的效果還是比較明顯的:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM