iOS 9 用的是哪種模糊演算法?
01-13
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?