Shameless self-bump!
I updated the lighting system. It looks (in my opinion) much more realistic now.
It renders the illumination areas to a render texture separately, and blurs it slightly.
It renders the geometry to a different render texture, and then uses one last fragment shader with both render textures as inputs. It uses the illumination texture as a sort of light map and alters the intensities of the pixels based on the intensity of the fragment in the light map. The brighter the area, the higher the intensity increase; the darker the area in the lightmap, the darker the area will appear in the scene.
There are a couple videos of it in play:
Here's one example
Here's another example with the weight on the light's color turned up, the max intensity turned down a bit, and the minimum intensity turned down.
The shadows seem to blend pretty nicely together now. There are a few artifacts and occasional flicker I need to fix, but I want to get it looking as nicely as possible first.
I now have 3 fragment shaders I'm using:
Lighting_Frag.fsh, which just creates the radial gradient (stolen from your Wiki).
BlurShader.fsh (pretty self-explanatory)
MaskShader.fsh, which takes parameters as inputs and adjusts the geometry texture using the light map texture.
uniform sampler2D MaskTexture - The lightmap
uniform sampler2D SceneTexture - The pre-rendered geometry
uniform float MinimumIntensity - The darkest you want a pixel (so it isn't completely black, not bad for keeping a dark ambient light)
uniform vec4 LightHue - The color of light being emitted by the source
uniform float HueIntensity - How heavily you want the hue to influence the hue of the final fragment
uniform float MaximumIntensity - The maximum intensity to apply. Useful to avoid getting totally washed out.
In the second picture, the values are:
MinimumIntensity = 1.0f
HueIntensity = 0.9f
MaximumIntensity = 5.0f
I still need to work on some of the shadows flickering, but it's acceptable right now. I'll also probably update the raycasting to more efficiently query the geometry, probably using a QuadTree or something.