SpriteRenderer の裏をぼかすシェーダ

意外と無かったので作りました

 

Shader "Custom/Sprite - BlurBack"
{
    Properties
    {
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
        _BlurAmount("Blur Amount", Float) = 0.1
    }

    SubShader
    {
        Tags { "Queue" = "Transparent" }
        GrabPass { "_BGTexture" }    // GrabPass を使用。シンプル!

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            sampler2D _BGTexture;
            float _BlurAmount;

            v2f vert( appdata v )
            {
                v2f o;
                o.vertex = UnityObjectToClipPos( v.vertex );
                o.uv = v.uv;
                return o;
            }

            half4 frag( v2f i ) : SV_Target
            {
                // ガウシアンぼかし
                float4 col = tex2D(_BGTexture, i.uv);
                float2 blurSize = float2(_BlurAmount / _ScreenParams.x, _BlurAmount / _ScreenParams.y);
                for (int x = -1; x <= 1; x++)
                {
                    for (int y = -1; y <= 1; y++) col += tex2D( _BGTexture, i.uv + float2(x, y) * blurSize );
                }
                return col / 9.0f;
            }
            ENDCG
        }

    }
}

GrabPass 便利ですね。(コンソールとかでも問題なく使えるんかな……?)