Unity3d 超級採樣消除鋸齒 Super Sampling Anti-Aliasing,unity3d消除鋸齒

來源:互聯網
上載者:User

Unity3d 超級採樣消除鋸齒 Super Sampling Anti-Aliasing,unity3d消除鋸齒
Super Sampling Anti-Aliasing
SSAA算是在眾多消除鋸齒演算法中比較昂貴的一種了,年代也比較久遠,但是方法比較簡單,
主要概括為兩步
1.    尋找邊緣
2.    模糊邊緣
這是一種post processing的處理方法,
接下來我們就看看怎麼實現
尋找邊緣尋找邊緣的原因也是因為減少消耗,這樣就可以只在邊緣處進行超級採樣,不必為全圖進行採樣了。
之前的文章詳細說過三種尋找邊緣的方法Roberts,Sobel,Canny ,其中sobel最優,所以我們就是用sobel尋找邊緣
這裡簡單講解一下,尋找邊緣的不同在於過濾器的不同,但都是水平垂直採樣
Sobel運算元的兩個過濾器分別算出橫向與縱向的灰階
 
GX為水平過濾器,GY為垂直過濾器,垂直過濾器就是水平過濾器旋轉90度。
過濾器為3x3的矩陣,將與映像作平面卷積。
如果不存在邊則兩個點顏色很接近,過濾器返回一個較小的值,否則就可判斷出邊緣的存在。
找出邊緣之後就可以模糊邊緣了

模糊邊緣模糊邊緣就是要進行超級採樣了,採取周圍的像素點再進行混色

大家經常看到比如說SSAAx2,SSAAx4,x8….後面的數目就是採樣點的個數。

之前翻譯了一篇wiki上的超級採樣

模糊邊緣的方式(採樣方式)有很多種,比較流行的幾種有
網格採樣,隨機採樣,poisson disc採樣,Jitter演算法採樣,旋轉網格採樣
 

部分方法的採樣範圍,我設定為他們邊緣的灰階了,也就是邊緣檢測中的G,因為G越大邊緣越深,出現鋸齒越明顯,就要加大採樣範圍。

我們試試網格,隨機,與旋轉採樣

網格採樣比較簡單,但是因為太規則了,模糊的效果可能不夠好,
顯擷取周圍的點,然後進行混色
float4 c0 = tex2D(_MainTex, i.uv_MainTex + fixed2(0.5, 1) / _Size);float4 c1 = tex2D(_MainTex, i.uv_MainTex + fixed2(-0.5, 1) / _Size);float4 c2 = tex2D(_MainTex, i.uv_MainTex + fixed2(0.5, -1) / _Size);float4 c3 = tex2D(_MainTex, i.uv_MainTex + fixed2(-0.5, -1) / _Size);



然後就是隨機,個人認為隨機的效果不太好,因為像是邊緣被噪波了一樣,有像素點擴散的痕迹
float2 randUV = 0;randUV = rand(float2(n.x, n.y));float4 c0 = tex2D(_MainTex, i.uv_MainTex + float2(randUV.x / 2, randUV.y) / _Size);randUV = rand(float2(-n.x, n.y));float4 c1 = tex2D(_MainTex, i.uv_MainTex + float2(randUV.x / 2, randUV.y) / _Size);randUV = rand(float2(n.x, -n.y));float4 c2 = tex2D(_MainTex, i.uv_MainTex + float2(randUV.x / 2, randUV.y) / _Size);randUV = rand(float2(-n.x, -n.y));float4 c3 = tex2D(_MainTex, i.uv_MainTex + float2(randUV.x / 2, randUV.y) / _Size);



然後就是旋轉網格採樣,最佳的旋轉角度是arctan (1/2) (大約 26.6°),這裡偷個懶,也省去了旋轉計算的消耗,大概個位置進行採樣,效果還算好。

<span style="font-size:14px;">float4 c0 = tex2D(_MainTex, i.uv_MainTex + fixed2(0.2 / 2, 0.8) / _Size);float4 c1 = tex2D(_MainTex, i.uv_MainTex + fixed2(0.8 / 2, -0.2) / _Size);float4 c2 = tex2D(_MainTex, i.uv_MainTex + fixed2(-0.2 / 2, -0.8) / _Size);float4 c3 = tex2D(_MainTex, i.uv_MainTex + fixed2(-0.8 / 2, 0.2) / _Size);</span>

結果比較





效能

效能方面SSAA比其他AA弱了一些,主要因為方法是這樣暴力的採樣

SSAA採樣方式間的損耗都差不多

都是SSAAx4

無消除鋸齒


網格採樣


隨機採樣

旋轉採樣


在unity中image effect的SSAA消耗與本文差不多

又看了一下其他的unity的消除鋸齒方法,發現FXAA消耗是最少的在2.8ms左右


全部代碼已共用至GitHub


                             ----- by wolf96  http://blog.csdn.net/wolf96/


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.