-1

This is shader to make UI blur. This shader work fine with android, but the y is invert on IOS device.

I try to search for an answer but I don't understand how to implement it. Because it is using MainTex, but in my case I use grabpass.

This is the link that i read. https://docs.unity3d.com/Manual/SL-PlatformDifferences.html

Shader "TFTM/Blur/Gaussian" {
    Properties {
    _blurSizeXY("BlurSizeXY", Range(0,20)) = 0
}
SubShader {

    // Draw ourselves after all opaque geometry
    Tags { "Queue" = "Transparent" }

    // Grab the screen behind the object into _GrabTexture
    GrabPass { }

    // Render the object with the texture generated above
    Pass {


        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag 
        #ifndef SHADER_API_D3D11

            #pragma target 3.0

        #endif
        sampler2D _GrabTexture : register(s0);
        float _blurSizeXY;

        struct data {
            float4 vertex : POSITION;
            float3 normal : NORMAL;

        };

        struct v2f {
            float4 position : POSITION;
            float4 screenPos : TEXCOORD0;
        };

        v2f vert(data i){
            v2f o;
            o.position = UnityObjectToClipPos(i.vertex);
            o.screenPos = o.position;
            return o;
        }

        half4 frag( v2f i ) : COLOR
        {

            float2 screenPos = i.screenPos.xy / i.screenPos.w;
            float depth= _blurSizeXY*0.0005;

            screenPos.x = (screenPos.x + 1) * 0.5;

            screenPos.y = (screenPos.y + 1) * 0.5;

            //horizontal 

            half4 sum = half4(0.0h,0.0h,0.0h,0.0h);  
            sum += tex2D( _GrabTexture, float2(screenPos.x-5.0 * depth, screenPos.y )) * 0.025;    
            sum += tex2D( _GrabTexture, float2(screenPos.x+5.0 * depth, screenPos.y )) * 0.025;

            sum += tex2D( _GrabTexture, float2(screenPos.x-4.0 * depth, screenPos.y)) * 0.05;
            sum += tex2D( _GrabTexture, float2(screenPos.x+4.0 * depth, screenPos.y)) * 0.05;


            sum += tex2D( _GrabTexture, float2(screenPos.x-3.0 * depth, screenPos.y)) * 0.09;
            sum += tex2D( _GrabTexture, float2(screenPos.x+3.0 * depth, screenPos.y)) * 0.09;

            sum += tex2D( _GrabTexture, float2(screenPos.x-2.0 * depth, screenPos.y)) * 0.12;
            sum += tex2D( _GrabTexture, float2(screenPos.x+2.0 * depth, screenPos.y)) * 0.12;

            sum += tex2D( _GrabTexture, float2(screenPos.x-1.0 * depth, screenPos.y)) *  0.15;
            sum += tex2D( _GrabTexture, float2(screenPos.x+1.0 * depth, screenPos.y)) *  0.15;

            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y)) *  0.16;

            return sum/2;

        }
        ENDCG
    }

    Pass {
        Blend One One

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag 
        #pragma target 3.0

        sampler2D _GrabTexture : register(s0);
        float _blurSizeXY;

        struct data {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
        };



        struct v2f {
            float4 position : POSITION;
            float4 screenPos : TEXCOORD0;
        };

        v2f vert(data i){
            v2f o;
            o.position = UnityObjectToClipPos(i.vertex);
            o.screenPos = o.position;

            return o;
        }

        half4 frag( v2f i ) : COLOR
        {
            float2 screenPos = i.screenPos.xy / i.screenPos.w;
            float depth= _blurSizeXY*0.0005;

            screenPos.x = (screenPos.x + 1) * 0.5;


            screenPos.y = (screenPos.y + 1) * 0.5;

            half4 sum = half4(0.0h,0.0h,0.0h,0.0h);

            //vertical

            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y+5.0 * depth)) * 0.025;    
            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y-5.0 * depth)) * 0.025;

            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y+4.0 * depth)) * 0.05;
            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y-4.0 * depth)) * 0.05;


            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y+3.0 * depth)) * 0.09;
            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y-3.0 * depth)) * 0.09;

            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y+2.0 * depth)) * 0.12;
            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y-2.0 * depth)) * 0.12;

            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y+1.0 * depth)) *  0.15;
            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y-1.0 * depth)) *  0.15;  

            sum += tex2D( _GrabTexture, float2(screenPos.x, screenPos.y)) *  0.16;


            return sum/2;

        }
        ENDCG
    }

}

Fallback Off
} 
Tengku Fathullah
  • 1,279
  • 1
  • 18
  • 43

1 Answers1

3

This is from Unity's FX/Glass/Stained BumpDistort

Vertex shader:

#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
o.uvgrab.zw = o.vertex.zw;

Fragment shader:

half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab));

Also take a look at blurry refractions from Extending Unity 5 rendering pipeline: Command Buffers

Pluto
  • 3,911
  • 13
  • 21