Generalist Programmer and Technical Artist
To transfer data to my shaders for monochrome, visible, and invisible effects, I created a shader manager game object, which transfered this data to each material of those shaders. Then, in the shaders I compared the fragment world position with the propogated light texture world position to determine alpha, alpha clipping, and if the texture should be monochrome or not.
The shader manager was also responsible to update and validate the game object light sources(which handeled their initial registration by themselves).
The light delegates similarly registered themselves to the shader manager, which then kept track of them. These performed asynchronous GPU read backs every few frames, to then delegate a read light value in the world, and forwarded it to linked light sources.
Since the world z height was tracked, and mapped in the texture, I could calculate, to some degree, how much light/color should be spread upwards (or technically limit the height). Of course, this causes issue if multiple lights are close by, which could be resolved in multiple ways.