My shader does not draw to the z buffer even with 'ZWrite On'

Below is my shader.
It seems pretty straightforward, but no part of any geometry that uses this shader seems to draw to the z buffer. If I apply any other opaque shader to the same geometry, it does draw to the zbuffer. What am I missing? I have ZWrite set to On, what else could it want? >_<
Any help is much appreciated.
I am using a deferred rendering camera to draw this.

Shader "MyShaders/Unlit"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Mod ("Brightness Mod", Range (0, 100)) = 1
        [MaterialEnum(Off,0,Front,1,Back,2)] _Cull ("Cull", Int) = 2
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Cull [_Cull]
        ZWrite On

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

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

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Mod;
         
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }
         
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                col *= _Mod;         

                return col;
            }
            ENDCG
        }
    }
}

since unity 5 you need a shadow caster pass to write to the z buffer. You could also use Fallback “Diffuse” or anything that has a shadow caster pass.

1 Like

OH great thank you!

Fallback "Diffuse"

worked

A minor note, when using Unity’s forward rendering path the ZBuffer is not the same thing as the camera depth texture. They are the same thing when using deferred, or more specifically the camera depth texture is a copy of the zbuffer in deferred.

1 Like