- Home /
Custom Lighting shader issue w Spot/Point lights and atten
I'm trying to create a Toon shader with very sharp shadows. I've got the outlines figured out, but I've been struggling to get the very sharp shadows that the toon-ish, almost anime-ish look requires. Recently, I found a solution to the problem when writing my own custom lighting model, but that solution only works with directional lights. The lighting model looks like this:
half4 LightingEnvironment (SurfaceCustomOutput s, half3 lightDir, half3 viewDir, half atten)
{
atten = step(0.5, atten);
half3 h = normalize(lightDir + viewDir);
float nh = max(0, dot(s.Normal, h));
float spec = pow(nh, _Shininess) * s.Specular;
half NdotL = dot (s.Normal, lightDir);
half diff = (NdotL * 0.5 + 0.5) * atten;
half3 ramp = tex2D (_Ramp, float2(diff, 0.5)).rgb;
half4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * ramp + spec * _SpecColor);
c.a = s.Alpha;
return c;
}
I'm filtering the atten value to get sharper shadows with the step function, basically combining the filtered atten with the shadow received from the light source/normal calculation. The final steps looks into a 1D ramp texture (black-to-white with a very sharp gradient). This also means that atten is not directly multiplied into the final equation, but rather used in the steps leading up to it.
For a directional light, this looks fairly promising:
Unfortunately, this breaks completely when adding a spot light or a point light. It basically looks like a 2D texture is being displayed in front of the rest (the screenshot shows a spot light):
I've tested with some different setups, and I can make this issue go away by multiplying atten onto the final equation (which is also the standard way of doing things, as far as I can tell). But doing that means that all the other code is useless, as it'll then show the standard rough shadows on top of the sharp one.
I'm not the most experienced in this area, so any tips on how to fix this (or potentially get very sharp shadows any other way), I'm all ears. The directional light I have in the scene uses the Unity default values for shadows. Unity version 5.0.1f1