請問FXAA、FSAA與MSAA有什麼區別?效果和性能上哪個好?
看到之前的回答實在是醉了- -"
首先所有MSAA, SSAA, FXAA, TXAA等都是抗鋸齒(Anti-Aliasing)技術。
鋸齒的來源是因為場景的定義在三維空間中是連續的,而最終顯示的像素則是一個離散的二維數組。所以判斷一個點到底沒有被某個像素覆蓋的時候單純是一個「有」或者「沒有"問題,丟失了連續性的信息,導致鋸齒。
最直接的抗鋸齒方法就是SSAA(Super Sampling AA)。拿4xSSAA舉例子,假設最終屏幕輸出的解析度是800x600, 4xSSAA就會先渲染到一個解析度1600x1200的buffer上,然後再直接把這個放大4倍的buffer下採樣致800x600。這種做法在數學上是最完美的抗鋸齒。但是劣勢也很明顯,光柵化和著色的計算負荷都比原來多了4倍,render target的大小也漲了4倍。
MSAA(Multi-Sampling AA)則很聰明的只是在光柵化階段,判斷一個三角形是否被像素覆蓋的時候會計算多個覆蓋樣本(Coverage sample),但是在pixel shader著色階段計算像素顏色的時候每個像素還是只計算一次。例如下圖是4xMSAA,三角形只覆蓋了4個coverage sample中的2個。所以這個三角形需要生成一個fragment在pixel shader里著色,只不過生成的fragment還是在像素中央(位置,法線等信息插值到像素中央)然後只運行一次pixel shader,最後得到的結果在resolve階段會乘以0.5,因為這個三角形只cover了一半的sample。現代所有GPU都在硬體上實現了這個演算法,而且在shading的運算量遠大於光柵化的今天,這個方法遠比SSAA快很多。順便提一下之前NV的CSAA,它就是更進一步的把coverage sample和depth,stencil test分開了。
MSAA的一個問題就是和現在大街小巷都是的deferred shading框架並不是那麼兼容。因為用deferred shading的時候場景都先被光柵化到GBuffer上去了,不直接做shading。硬要做的話可以看我之前寫的這個SDK Sample(Antialiased Deferred Shading,大概思路就是用各種方法檢測一下哪個pixel是被多個fragment cover的才手動做super sampling)。
因為MSAA這個問題現代引擎里都用的是Post Processing AA這一類技術。這一類東西包括FXAA,TXAA等,不依賴於任何硬體,完全用圖像處理的方法來搞。有可能會依賴於一些其他的信息例如motion vector buffer或者前一貞的變換矩陣來找到上一貞像素對應的位置,然後再做一些hack去blur或者blend上一貞的顏色等。通常非常hacky,FXAA的發明人原來是我們組的,他自己都不知道這個為什麼會work- -」,但是精心調校之後後效果還是很好的,例如下面是UE4的Post Processing AA開關對比圖:
最後再扯一下NV最新的那個MFAA(Multi-Frame AA),因為Maxwell架構支持的programmable coverage sample location,所以可以做到貞間用不同的coverage sample位置,當FPS足夠高的時候,2xMFAA就可以達到4xMSAA的效果。對玩家來說,看著舒服就行。當然像使命召喚這種明明是forward rendering還要用SSAA來抗鋸齒的,在顯卡爛的機子上開還是要慎重的。。
首先原理部分請直接參考1樓即可,很專業。
關於各種抗鋸齒的效果和性能影響(一般用FPS度量),已經有很多的評測和對比,建議LZ搜一下,而且不同顯卡晶元廠商的技術方向也是不同的(貌似這個跟顯卡架構也有關係,可以針對性優化)。
目前市面上流行的抗鋸齒技術類型應該有6-7種了,不過近幾年的遊戲貌似不太在前端給用戶展示這些概念性的東西了,而是轉為用高、中、低畫面效果的模糊方式來提供不同用戶選擇,其實這 也是一個進步,遊戲用戶不需要了解你的技術,他只需要在自己的硬體範圍內選擇最佳的效果和幀數即可。
簡單才是好的,跑題了。MSAA、FXAA都是FSAA技術。
FSAA:全屏抗鋸。
FSAA中最簡單也是最慢的方法是SSAA,渲染一幅為屏幕尺寸N倍的幀,然後用若干個像素混合成一個像素。
而MSAA基本上只對畫面中物體的邊緣進行放大、混合的抗鋸操作,因為邊緣是鋸齒最明顯的地方(注意不是所有的邊緣)。提取邊緣,主要是結合深度技術。MSAA是種硬體AA。
我們一般說的4x、8x,就是放大倍數,放得越大,供混合的採樣越充份,效果越好,但是處理速度也就越慢。
FXAA也是種取邊緣的技術。但是和MSAA不同,MSAA提邊緣是在圖形管線的前段(跟深度有關)。FXAA是種後處理技術,後處理技術一般在畫面完成後,通過像素顏色檢測邊緣(色彩差異太大時,不是邊緣也被認為成邊緣,精度有問題)。後處理技術一般沒倍數概念,因為不存在放大。
FXAA的精度肯定不如MSAA,但是不像MSAA那樣依賴顯卡的深度處理能力和顯存大小。所以,好的硬體上,撐得住MSAA就用MSAA,撐不住那麼用FXAA可能效果最優。不能一概而論。
正因為不是所有邊緣都需要AA,所以MSAA這種對所有邊緣都進行AA的演算法,存在著浪費。也就意味著後處理AA技術有很大的發展價值。MXAA效果最好,FXAA性能最好
這問題都能百度到啊……
卡吧基佬不專業的回答下。
首先FSAA是全屏抗鋸齒不討論了,然後FXAA和MXAA都是邊緣抗鋸齒。FXAA精度較低,導致畫面比較「糊」,塗抹痕迹嚴重,但是對硬體要求較低。MXAA精度高,效果好,但是對硬體要求高,就這。
普通用戶知道這些就夠了,專業方向請看第一的答案。
660ti SLI 2012年下半出的, 2012年底看linus推薦的, 2013年初入的, 2016年末終於2個都壞掉, 玩ow這種開144%全高都只佔用1.5g的這個年代角度來講 masterrace指數=垃圾 的遊戲 反而能在開最低特效的時候秒殺1070頂配asus的幀數(穩定240+, 這還是接近廢了的時候 ,1070保證最高220都不穩定, 經常200以內)
網上一查 700系開始垃圾maxwell架構為了迎合無腦eyecandy遊戲拋棄了之前5系6系都有的16x 32x之類, 事實證明越老的東西越好
推薦閱讀:
※能否設計出不會導致近視的顯示屏?
※光線追蹤中的透視畸變如何矯正?
※為什麼會有那麼多類型的 BxDF?
※高斯模糊和高斯有什麼關係?
※為何遊戲里的3d渲染速度非常快,而三維軟體實時渲染非常慢?