- Home /
Colored Lights on a Light/Shadow Only Shader
Welp. This is the last problem I've been having with lighting in my game...
The following shader is what I use to make geometry "invisible", but still take light and shadows. It works, but only partially: colored light sources still appear as white on the surface, and they don't vary according to intensity of the light (unless the intensity is 0).
I will love you forever if you can fix it. And maybe I can send you a free copy of the game when it's done, I don't know if that's allowed. >.>
Here's the Unity shader code:
Shader "Custom/Matte Shadow" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
Tags {"Queue"="AlphaTest" "RenderType"="TransparentCutout"}
LOD 200
Blend Zero SrcColor
Offset 0, -1
CGPROGRAM
#pragma surface surf ShadowOnly alphatest:_Cutoff fullforwardshadows
fixed4 _Color;
struct Input {
float2 uv_MainTex;
};
inline fixed4 LightingShadowOnly (SurfaceOutput s, fixed3 lightDir, fixed atten) {
fixed4 c;
c.rgb = s.Albedo*atten;
c.a = s.Alpha;
return c;
}
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = _Color;
o.Albedo = c.rgb;
o.Alpha = 1.0f;
}
ENDCG
}
Fallback "Transparent/Cutout/VertexLit"
}
Answer by Kaboom · Dec 14, 2014 at 10:04 PM
I hope you've solved your problem already, but I just ran into the same thing, as I was using the exact same shader you posted and then tried using colored lights.
After some searching I found http://forum.unity3d.com/threads/cg-shader-light-color.151535/, and with some experimenting figured that the following works for me: replace line 34:
fixed4 c = _Color;
With
fixed4 c = _LightColor0 + _LightColor0 * _Color;
That seems to give me proper results. At first I just tried adding the two colors (_LightColor0 + _Color) but then the lights are too bright. Multiplying them makes everything darker. This, to me, looks exactly right.
If someone can chip in as to why/how this works, I'd be interested!