How to build a two sided sprite shader with zwrite on.
I'm trying to build a shader that essentially treats a sprite as a 3d mesh rendered plane. I have a character built out of numerous individual sprite layers. Because they rely on a parenting structure, I can't use the "flip x" function on the sprites to handle character flips. I want these sprite layers to be able to react to 3d lighting, cast shadows, and write to the zdepth pass. Currently, I have a two step shader functioning so that the sprite normal vector flips when I rotate the character 180 degrees (i.e. character walks left... this function is for light calculation), the sprites cast shadows from both sides of the sprite, and it correctly writes to the zdepth layer when the character is facing right. When I move the character left though (and therefore the sprites are flipped), everything functions correctly except the character no longer writes data to the zdepth. I'm guessing that it disappears from the Zdepth layer because the sprite vector used to calculate those pixels is now facing away from the camera. I'm not an expert by any means with shaders, so any help would be much appreciated. The following is my shader code:
// Sprite Shadow Shader
Shader "Sprites/Custom/SpriteShadow" { Properties { [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap("Pixel snap", Float) = 0 [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1) [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1) [PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {} [PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0 _Cutoff("Alpha Cutoff", Range(0,1)) = 0.5 }
SubShader { Tags { "Queue" = "Geometry" "IgnoreProjector" = "True" "RenderType" = "AlphaTest" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" }
Cull Back Lighting Off ZWrite On Blend One OneMinusSrcAlpha
CGPROGRAM #pragma surface surf Lambert vertex:vert alphatest:Cutoff addshadow nofog nolightmap nodynlightmap keepalpha noinstancing #pragma multi_compile_local PIXELSNAP_ON #pragma multi_compile _ ETC1_EXTERNAL_ALPHA #include "UnitySprites.cginc"
struct Input { float2 uv_MainTex; fixed4 color; };
void vert(inout appdata_full v, out Input o) { v.vertex = UnityFlipSprite(v.vertex, _Flip);
if defined(PIXELSNAP_ON)
.vertex = UnityPixelSnap(v.vertex); #endif
UNITY_INITIALIZE_OUTPUT(Input, o); o.color = v.color _Color _RendererColor; }
void surf(Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) _Color; o.Albedo = c.rgb c.a; o.Alpha = c.a; }
ENDCG
Cull Front Lighting Off ZWrite On Blend One OneMinusSrcAlpha
CGPROGRAM #pragma surface surf Lambert vertex:vert alphatest:Cutoff addshadow nofog nolightmap nodynlightmap keepalpha noinstancing #pragma multi_compile_local PIXELSNAP_ON #pragma multi_compile _ ETC1_EXTERNAL_ALPHA #include "UnitySprites.cginc"
struct Input { float2 uv_MainTex; fixed4 color; };
void vert(inout appdata_full v, out Input o) { v.normal *= -1;
if defined(PIXELSNAP_ON)
.vertex = UnityPixelSnap(v.vertex); #endif
UNITY_INITIALIZE_OUTPUT(Input, o); o.color = v.color _Color _RendererColor; }
void surf(Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) _Color; o.Albedo = c.rgb c.a; o.Alpha = c.a; }
ENDCG
}
Fallback "Transparent/VertexLit" }
..... Does anyone know how to get my shader to correctly write to the zdepth layer when my character is facing left (sprite is rotated 180 degrees relative to the camera)?