Custom Sprites/Diffuse shader w/ shadows not lighting properly

I wrote a custom shader based on the default Sprites/Diffuse so it could emit shadows, and it works gratly for that… Unfortunately though it is not responding well to the directional light in the scene, appearing too dark to be seen. Here’s a screenshot of how it looks:

As you can see, it is being lit very weakly. The only way to make it look decently visible is to put 2 directional light with a strength of about 7, but as you can guess the rest of the scene looks like crap if I do it.

Here’s the shader:

Shader "Sprites/Cutoff-Shadow"
{
	Properties
	{
		[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
		_Color ("Tint", Color) = (1,1,1,1)
		[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
		_Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.5
	}

	SubShader
	{
		Tags
		{ 
			"Queue"="Transparent" 
			"IgnoreProjector"="True" 
			"RenderType"="Transparent" 
			"PreviewType"="Plane"
			"CanUseSpriteAtlas"="True"
		}

		Cull Off
		Lighting Off
		ZWrite Off
		Fog { Mode Off }
		Blend One OneMinusSrcAlpha
		
		CGPROGRAM
		#pragma surface surf Lambert alpha addshadow vertex:vert
		#pragma multi_compile DUMMY PIXELSNAP_ON

		sampler2D _MainTex;
		fixed4 _Color;

		struct Input
		{
			float2 uv_MainTex;
			fixed4 color;
		};
		
		void vert (inout appdata_full v, out Input o)
		{
			#if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
			v.vertex = UnityPixelSnap (v.vertex);
			#endif
			v.normal = float3(0,0,-1);
			
			UNITY_INITIALIZE_OUTPUT(Input, o);
			o.color = v.color * _Color;
		}

		void surf (Input IN, inout SurfaceOutput o)
		{
			fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
			o.Albedo = c.rgb * c.a;
			o.Alpha = c.a;
		}
		ENDCG
	}

Fallback "Transparent/Cutout/VertexLit"
}

I hope someone can cast a light on it (no pun intended)

Extremely late, but posting for posterity.

I found that the built-in sprite-diffuse shader rendered all black in certain conditions (in my case it was when the object was using a Skinned Mesh Renderer).

I eventually seem to have solved it in the void surf() function by removing:

  • IN.color

on line 54. I assume the colour input is determined as black instead of white under certain conditions, so a better solution might involve replacing it, but for now simply removing it has done the job.