Ok, so here's a big post about lighting and shaders in the game. If there are any questions, post them up! Also if there's anything else people are interested in, let me know and I'll write it up.
Lighting
The lighting is a lot simpler than it looks. Everything is done using the standard set of light types: ambient, directional, point and spot. They all have the basic parameters of color and intensity. Directional lights obviously have a 3D direction and point lights have an outer radius. Spot lights are essentially a combination of directional and point lights, with an inner and outer cutoff value to determine how sharp the falloff is at the edges of the light cone.
I do a lot of fake lighting setups to emulate more complex light interactions. My first experiences with game development was making maps with the original Unreal Tournament editor, and a big part of lighting with older engines that don’t have any indirect lighting systems is placing less intense bounce lights in places where light radiance should be happening (see the UnrealEd screenshot below). By combining one strong main light source with a well-tweaked ambient value and a few fake bounce lights, you can create the illusion of a much more complex lighting system. The advantage of this is that you end up with more control of how light affects your scenes and you can tweak it a little to your needs instead of trying to deal with the “technically correct” values.
I also fake the ambient occlusion in interior areas as well. Again, this allows for more artistic control over values and keeps things from ending up like Far Cry 3. Most of this is achieved with gradients baked into the room textures. The back wall of each room has an “interior shadow” effect on it, and combined with the wall texture (which is usually pretty much just a gradient texture) it gives the effect of occluded corners. There are also certain elements that have non-dynamic ambient occlusion effects added, such as doors.
Post processing
I wanted to throw in a little bit about one of the post-processing passes since it has a pretty big effect on the lighting. The Contrast-Saturation-Brightness pass does a lot to fool the eye into believing some of the tricks. Its main purpose is to help define the style and feel of each section, but by upping the contrast or brightness in each section it “crunches” the lighting values causing an overexposed look which seems to fool the eye into assuming there’s more detail than there actually is.
Below I've put two screenshots of the same room side-by-side. The top one has higher contrast and saturation levels, while the second one has the default values.
Shaders
The shaders that render all this stuff are nothing special themselves. Just standard Blinn-Phong lighting equations that can be found in any GLSL tutorial. My favourite bit about the shader system I created is that all shaders are written at runtime. I have a shader manifest with all the shaders that are required (eg. One for objects that have a diffuse texture but are unlit, another for objects that only have a color and a normal map). Each entry in the manifest has flags for the bits of code that the shader will require, it then goes through each entry and concatenates the chunks of shader code that I’ve already written into a usable shader. This means that I have the code for lighting an object with a point light written in one place and it gets used in every shader that needs point light calculation.
I also use this system for non-standard shaders like any of the post-processing ones or the water shader. For those shaders the pixel shader is already full written by hand, but since I don’t need anything special in the vertex shader I just generate it on the fly with the same system.
Hopefully all that made some sense! Again let me know if you've got any questions.