Search Unity

  1. Unity 2020.2 has been released.
    Dismiss Notice
  2. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice

The new LWRP broke my simple shader!

Discussion in 'General Graphics' started by exzizt, Aug 31, 2019.

  1. exzizt

    exzizt

    Joined:
    Sep 30, 2017
    Posts:
    78
    Here is my shader:
    Code (CSharp):
    1.  
    2. Shader "Sprite/SpriteDropShadow"
    3. {
    4.     Properties
    5.     {
    6.         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
    7.         _Color ("Tint", Color) = (1,1,1,1)
    8.         [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
    9.         _ShadowColor ("Shadow", Color) = (0,0,0,1)
    10.         _ShadowOffset ("ShadowOffset", Vector) = (0,-0.1,0,0)
    11.     }
    12.  
    13.     SubShader
    14.     {
    15.         Tags
    16.         {
    17.             "Queue"="Transparent"
    18.             "IgnoreProjector"="True"
    19.             "RenderType"="Transparent"
    20.             "PreviewType"="Plane"
    21.             "CanUseSpriteAtlas"="True"
    22.         }
    23.  
    24.         Cull Off
    25.         Lighting Off
    26.         ZWrite Off
    27.         Blend One OneMinusSrcAlpha
    28.  
    29.         // draw shadow
    30.         Pass
    31.         {
    32.         CGPROGRAM
    33.             #pragma vertex vert
    34.             #pragma fragment frag
    35.             #pragma multi_compile _ PIXELSNAP_ON
    36.             #include "UnityCG.cginc"
    37.            
    38.             struct appdata_t
    39.             {
    40.                 float4 vertex   : POSITION;
    41.                 float4 color    : COLOR;
    42.                 float2 texcoord : TEXCOORD0;
    43.             };
    44.  
    45.             struct v2f
    46.             {
    47.                 float4 vertex   : SV_POSITION;
    48.                 fixed4 color    : COLOR;
    49.                 float2 texcoord  : TEXCOORD0;
    50.             };
    51.            
    52.             fixed4 _Color;
    53.             fixed4 _ShadowColor;
    54.             float4 _ShadowOffset;
    55.  
    56.             v2f vert(appdata_t IN)
    57.             {
    58.                 v2f OUT;
    59.                 OUT.vertex = UnityObjectToClipPos(IN.vertex+_ShadowOffset);
    60.                 OUT.texcoord = IN.texcoord;
    61.                 OUT.color = IN.color *_ShadowColor;
    62.                 #ifdef PIXELSNAP_ON
    63.                 OUT.vertex = UnityPixelSnap (OUT.vertex);
    64.                 #endif
    65.  
    66.                 return OUT;
    67.             }
    68.  
    69.             sampler2D _MainTex;
    70.             sampler2D _AlphaTex;
    71.             float _AlphaSplitEnabled;
    72.  
    73.             fixed4 SampleSpriteTexture (float2 uv)
    74.             {
    75.                 fixed4 color = tex2D (_MainTex, uv);
    76.                 color.rgb = _ShadowColor.rgb;
    77.  
    78.                 #if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    79.                 if (_AlphaSplitEnabled)
    80.                     color.a = tex2D (_AlphaTex, uv).r;
    81.                 #endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    82.  
    83.                 return color;
    84.             }
    85.  
    86.             fixed4 frag(v2f IN) : SV_Target
    87.             {
    88.                 fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
    89.                 c.rgb *= c.a;
    90.                 return c;
    91.             }
    92.         ENDCG
    93.         }
    94.  
    95.         // draw real sprite
    96.         Pass
    97.         {
    98.         CGPROGRAM
    99.             #pragma vertex vert
    100.             #pragma fragment frag
    101.             #pragma multi_compile _ PIXELSNAP_ON
    102.             #include "UnityCG.cginc"
    103.            
    104.             struct appdata_t
    105.             {
    106.                 float4 vertex   : POSITION;
    107.                 float4 color    : COLOR;
    108.                 float2 texcoord : TEXCOORD0;
    109.             };
    110.  
    111.             struct v2f
    112.             {
    113.                 float4 vertex   : SV_POSITION;
    114.                 fixed4 color    : COLOR;
    115.                 float2 texcoord  : TEXCOORD0;
    116.             };
    117.            
    118.             fixed4 _Color;
    119.  
    120.             v2f vert(appdata_t IN)
    121.             {
    122.                 v2f OUT;
    123.                 OUT.vertex = UnityObjectToClipPos(IN.vertex);
    124.                 OUT.texcoord = IN.texcoord;
    125.                 OUT.color = IN.color * _Color;
    126.                 #ifdef PIXELSNAP_ON
    127.                 OUT.vertex = UnityPixelSnap (OUT.vertex);
    128.                 #endif
    129.  
    130.                 return OUT;
    131.             }
    132.  
    133.             sampler2D _MainTex;
    134.             sampler2D _AlphaTex;
    135.             float _AlphaSplitEnabled;
    136.  
    137.             fixed4 SampleSpriteTexture (float2 uv)
    138.             {
    139.                 fixed4 color = tex2D (_MainTex, uv);
    140.  
    141.                 #if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    142.                 if (_AlphaSplitEnabled)
    143.                     color.a = tex2D (_AlphaTex, uv).r;
    144.                 #endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    145.  
    146.                 return color;
    147.             }
    148.  
    149.             fixed4 frag(v2f IN) : SV_Target
    150.             {
    151.                 fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
    152.                 c.rgb *= c.a;
    153.                 return c;
    154.             }
    155.         ENDCG
    156.         }
    157.     }
    158. }
    Here's an image explaining the issue: upload_2019-8-30_16-21-51.png
     
  2. bgolus

    bgolus

    Joined:
    Dec 7, 2012
    Posts:
    9,601
    LWRP doesn’t support multi-pass shaders. You’ll have to use multiple sprites.
     
  3. exzizt

    exzizt

    Joined:
    Sep 30, 2017
    Posts:
    78
    I see... So what about this shader is "multi-pass", exactly? I'm not very familiar with shaders.
    Also, any workarounds?
     
  4. bgolus

    bgolus

    Joined:
    Dec 7, 2012
    Posts:
    9,601
    There are two passes you expect to render one after the other. Hence, multi-pass.

    The work around is use two sprites.
     
  5. exzizt

    exzizt

    Joined:
    Sep 30, 2017
    Posts:
    78
    Thanks. I've already just done that! :)
     
unityunity