2D Splatter Effects in Unity Using the Stencil Buffer

来源:互联网 发布:淘宝代购only是正品吗 编辑:程序博客网 时间:2024/05/28 11:48
Shader "Splatter/Surface"{    Properties    {        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}        _Color ("Tint", Color) = (1,1,1,1)        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0        _AlphaCutoff("Alpha Cutoff", Range(0.01, 1.0)) = 0.01    }    SubShader    {        Tags        {            "Queue"="Transparent"            "IgnoreProjector"="True"            "RenderType"="Transparent"            "PreviewType"="Plane"            "CanUseSpriteAtlas"="True"        }        Cull Off        Lighting Off        ZWrite Off        Blend One OneMinusSrcAlpha        Pass        {            Stencil            {                Ref 5                Comp Always                Pass Replace            }        CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #pragma multi_compile _ PIXELSNAP_ON            #include "UnityCG.cginc"            struct appdata_t            {                float4 vertex   : POSITION;                float4 color    : COLOR;                float2 texcoord : TEXCOORD0;            };            struct v2f            {                float4 vertex   : SV_POSITION;                fixed4 color    : COLOR;                half2 texcoord  : TEXCOORD0;            };            fixed4 _Color;            fixed _AlphaCutoff;            v2f vert(appdata_t IN)            {                v2f OUT;                OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);                OUT.texcoord = IN.texcoord;                OUT.color = IN.color * _Color;                #ifdef PIXELSNAP_ON                OUT.vertex = UnityPixelSnap (OUT.vertex);                #endif                return OUT;            }            sampler2D _MainTex;            sampler2D _AlphaTex;            float _AlphaSplitEnabled;            fixed4 SampleSpriteTexture (float2 uv)            {                fixed4 color = tex2D (_MainTex, uv);                if (_AlphaSplitEnabled)                    color.a = tex2D (_AlphaTex, uv).r;                return color;            }            fixed4 frag(v2f IN) : SV_Target            {                fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;                c.rgb *= c.a;        // Discard pixels below cutoff so that stencil is only updated for visible pixels.                clip(c.a - _AlphaCutoff);                return c;            }        ENDCG        }    }

}

Shader "Splatter/Splatter"{    Properties    {        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}        _Color ("Tint", Color) = (1,1,1,1)        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0    }    SubShader    {        Tags        {            "Queue"="Transparent"            "IgnoreProjector"="True"            "RenderType"="Transparent"            "PreviewType"="Plane"            "CanUseSpriteAtlas"="True"        }        Cull Off        Lighting Off        ZWrite Off        Blend One OneMinusSrcAlpha        Pass        {            Stencil            {                Ref 5                Comp Equal            }        CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #pragma multi_compile _ PIXELSNAP_ON            #include "UnityCG.cginc"            struct appdata_t            {                float4 vertex   : POSITION;                float4 color    : COLOR;                float2 texcoord : TEXCOORD0;            };            struct v2f            {                float4 vertex   : SV_POSITION;                fixed4 color    : COLOR;                half2 texcoord  : TEXCOORD0;            };            fixed4 _Color;            v2f vert(appdata_t IN)            {                v2f OUT;                OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);                OUT.texcoord = IN.texcoord;                OUT.color = IN.color * _Color;                #ifdef PIXELSNAP_ON                OUT.vertex = UnityPixelSnap (OUT.vertex);                #endif                return OUT;            }            sampler2D _MainTex;            sampler2D _AlphaTex;            float _AlphaSplitEnabled;            fixed4 SampleSpriteTexture (float2 uv)            {                fixed4 color = tex2D (_MainTex, uv);                if (_AlphaSplitEnabled)                    color.a = tex2D (_AlphaTex, uv).r;                return color;            }            fixed4 frag(v2f IN) : SV_Target            {                fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;                c.rgb *= c.a;                return c;            }        ENDCG        }    }}

0 0
原创粉丝点击