Ambient light (or indirect light) is light that is not coming directly from a bright light source. For example, in an outdoor scene, the sun is a direct light, and the ambient light comes from the sky and the ground. Here's a picture of the shadowed side of an Overgrowth character, showing how it's lit by scattered light from the sky and the ground:
Historically, ambient lighting has been represented by a uniform grey light that fills the entire scene, eliminating any pure black shadows. This works to make the lighting less stark, but it doesn't fulfill any of the other functions of real ambient lighting: reacting to surface shapes and environmental coloring in order to add definition and bring the scene together. Here's a comparison of uniform ambient lighting and Overgrowth ambient lighting.
I found that image-based lighting is the most intuitive and efficient way to achieve this effect. The method used in Overgrowth is based on cubemaps, which are groups of six images that combine to form the faces of a cube. We start out with the cubemap containing the sky and distant terrain, and blur it to create a diffuse lighting cubemap. To blur the cubemap we just perform a cylindrical blur around each axis, as shown here:
This is very fast because the lighting cubemap can be quite small -- ours has faces of size 128*128. To prevent banding artifacts, we have to use a floating-point texture for the blurring, but afterwards it's stored in a DXT1 RGB texture for efficiency.
Now, to find the ambient light color for an object, we can just look up the cubemap in the direction of the surface normal. That's all there is to it! I really like this technique because it's fast, simple, and effective. It's limited in that it only works well for uniform outdoor scenes, but since that is the most common setting in Overgrowth, it works well for us!
Do you have any questions about how this works, or ideas about how we can improve our ambient lighting?