(Is it too late to chime in…? )
We’ve had to deal with this, too. There are many cases in Prominence where environmental lighting changes as a result of player actions or other in-game events. As I was reading through the thread, some thoughts came to mind, based on our production work here. In no particular order…
Shaders, Blowout and Glow
Completely agreed re: the pixel shader approach. It’ll be nice to have eventually. We prototyped some shaders for Prominence which we hoped to use to bloom bright lights, but ran into technical issues. Kevin could go into more detail, but I think it had to do with the varied levels of OpenGL implementation/drivers of all the different graphics chipsets. We shelved the idea in favor of some other features, and chose instead to shoot for a good amount of contrast in the dark scenes with just a hint of pre-rendered glow around lights (carefully positioned whenever possible to avoid creeping over cube edges).
I have an idea to bring renders back in my 3D app after initial rendering (presumably to EXR or another high-dynamic range format), map them to a cube as 100% luminous textures, apply a glow effect based on a luminosity threshold so that only the light sources trigger the glow, and then render out the resulting faces – but I haven’t gotten 'round to testing it yet, and I think it’ll only work if the glow is a true 3D calculation (as opposed to a 2D post effect).
Not sure if it’s any help, but when an environment needed to have multiple lighting states, the organizational approach that worked for me was to have multiple light rigs, each parented to a master null named for the lighting state (e.g. “fully_lit”, “half_lit”, “dark”, etc.).
Then if a light needs to change color or intensity between states, no problem – the light can be cloned, renamed, adjusted and then assigned to the matching null. If more or fewer lights are required for a state, that’s not a problem either, since the rigs are independent – just delete (or add) what’s needed for that particular state. And if there are some lights common to all the states, they can be assigned to an “always on” null or simply left alone as part of the main scene.
With this technique, it’s pretty straightforward to look at the scene content and see what’s going on and then set the state nulls to be on or off as needed. And if, say, there are tiki torches that need to be around the camp for the “night” state, those objects (or other scene elements) can easily be worked into null-controlled states as well for easy scene management.
Darkness with Depth
[ul][li]Chiaroscuro. Endless inspiration from the masters.[/li]
[li]Create/control negative space through silhouette, rim/kick/back lighting, light wrap. These all kind of fall into the same category for me. Easy start: Put an object in front of a wall and then put a light between them.[/li]
[li]Imari mentioned fog/haze to help enhance depth, and I completely agree. It doesn’t take a lot, either – just a few percent over a good distance. Unless you’re specifically going for “epic fog”, though, it’s probably better to think of it like adding film grain; that is to say that if players notice it, it’s probably too much.[/li]
[li]Use of a cuculoris or cookie on lights to help create mood, dimension and interest. A great old theater trick that also works wonders in 3D.[/li]
[li]Volumetric lights (real or faked) can be effective, I think, but I find them much more convincing when the player is moving through the scene so that they get a sense of the footprint of where the light is landing/projecting. We have a lot of node-to-node transitions in Prominence, but I’m not sure the volumetrics would be as effective if the transitions weren’t there.[/li]
[li]I’ve read and been told that warm colors tend to come forward while cool colors tend to move back. I personally don’t see it in most cases, and it seems less convincing to me than other options. You might feel differently, though.[/li][/ul]
On the subject of color, it can be helpful to remember that lighting in 3D programs is all mathematically based on RGB values. When lights are combined, the RGB values of the lights are added. So if you take three spotlights – a 100% red spotlight, a 100% green spotlight, and a 100% blue spotlight – and shine them onto a white surface so that they overlap, the RGB values add to produce the resulting color. In the center, where all three cones overlap, the light sums to be closer and closer to white.
However, when lights encounter objects, the calculation switches to multiplication. That matters because if a channel is at (or near) zero on either the light or the object, you won’t see that color in the resulting image. For example, here is a scene with a white ground plane and a series of spheres. Looks simple enough, right?
If the light in the scene is changed to a 100% red light…
Half the spheres have turned black. Why? Because only the top 3 spheres have values above zero in the red channel. The other 3 only contain values for green and blue, and thus, when hit with a red light, the light multiplies out to zero and the surface appears black. Similarly, the 100% red light has no blue or green component, so those multiply out to zero and the ground plane appears red.
This is a pretty extreme case, of course, but hopefully it illustrates how easily a seemingly bizarre color shift can appear in a render if light colors or surface colors are strongly biased to different channels. Of course, depending on how your post-work filters are operating, similar effects can crop up there, too.
Monitors, Calibration, and Levels
I’ve found it helpful to work on a calibrated monitor and then test on as many different screens as possible (we’ve probably got about 10 or 12 monitors between the Prominence crew and internal testers). If you’re rendering assets and don’t have some testers or extra monitors, go find some. Get volunteers. Bribe friends. Strong-arm family members. You don’t want to get a good way into your game and then find out it’s unplayable on 25% of your beta testers’ screens (which I think is what Nigec was talking about as well).
Well, I think I’ve babbled enough here for one post. Hope this proves helpful to someone… and don’t even get me started on color temperature!