Hello, everyone! Let’s again create a spatial shader for a 3D object. This tutorial is special because for the first time I will touch on a function that I have completely ignored so far. It is the function called light, and I will show how we can work with it.


Youtube encoding doesn’t help, but I’m not sure about the “fire” effect here.
It reminds me of when I turned Minecraft’s end skybox into a purple-ish Moiré pattern (no shader needed, just a checkerboard texture viewed at a distance+angle).
Back to Godot, I made a toon-like light shader with the step function being the important bit*. It is probably good enough to use, though it’s a bit frustrating how I can’t seem to keep input colors accurate. Ambient color works acceptably, though I somewhat wish I could control it more, also seeing issues with light range/multiple lights.
I also haven’t found a good way to handle light color. I can ignore it or mix color (can look ugly). It’s probably possible with dot() but I can’t seem to do it right.
Using HSV is probably needed here, although to me it seems like an absolute mess without it being built-in.
* unshaded+1 shadow w/ambient with
DIFFUSE_LIGHT =, 5(?) shades withDIFFUSE_LIGHT +=but it’s also too brightEDIT: I’ve figured it out by going by the docs again, I did need
ATTENUATIONand+=to properly handle shadows and multiple lights respectively. I also haveLIGHT_COLORwith dot() in a way I like (currently handling it in each rgb channel), though it can still render incorrectly if looking through a spotlight of a different hue (attenuation makes it worse).Yeah, I don’t say it’s the best possible simulation. It could be a lot better. The point was to demonstrate the usage of the light() function, mostly.