iOS 9 用的是哪種模糊演算法?

e蘋果ios9界面上的模糊效果真心不錯,而且模糊程度還是實時變化的,效果很贊。我用高斯模糊演算法寫的shader,一旦模糊程度太大就特難看,有明顯格子痕迹,不像蘋果那麼自然。請問各大神,蘋果這個是怎麼做的?

fixed4 frag(v2f i) : COLOR

{

_Factor = _Factor/20;

float4 col = float4(0,0,0,0);

int RANGE = 2;

float gaussTotal = 0;

int x,y;

for (y=-RANGE; y&<=RANGE; y+=1.0)

{

for (x=-RANGE; x&<=RANGE; x+=1.0)

{

float2 newUV = i.uv+float2(x,y) * _Factor;

if(newUV.x&>=0 newUV.x&<=1 newUV.y&>=0 newUV.y&<=1)

{

float temp = Gaussian( sqrt( x*x + y*y ) );

gaussTotal += temp;

fixed4 c = tex2D(_MainTex,newUV);

col += temp * c;

}

}

}

col/=gaussTotal;

return col;

}


Gaussian blur 是 separable kernel,通常會用兩個 pass 實現。那麼同等計算量可以有更多的 taps,品質自然更好。

另外,kernel 應由 CPU 計算,shader 只需要做加權求和。


不得不說 Apple 這套高斯模糊也是有問題的,見下圖的紅綠交界處,紅色和綠色變成了棕色。

解決方法大概是先對 RGB 取自然對數,對結果取以自然為底、目標值為指數的值。

這大概也能解釋為何紅綠色盲看到紅綠為棕色。


推薦閱讀:

Unity5.X中屏幕空間陰影投射技術(Screenspace ShadowMap)如何產生陰影圖?
unity移動開發如何依據性能選擇shader?

TAG:遊戲開發 | Unity遊戲引擎 | 計算機圖形學 | shader |