Radiosity / GI / Indirect illumination

There are many phrases associated with the idea of "bouncing" light depending on the program you use. Radiosity, Global Illumination, Indirect lighting, the Final Gather process, they all describe essentailly the same thing - the process of calculating light "bouncing" off of surfaces to create a more realistic image.

Here are the general settings common for most Indirect illumination algorithms.

How it works

Essentially indirect lighting is accomplished through calculating multiple "bounces" of rays from user defined light sources.

Bounce Count

The first option you'll generally see for indirect lighting is too change the number of bounces for each light.

Of course increasing this number will increase the render time of the image since every incriment

Quality

This is the setting that will vary most between programs because it is never just one setting. The optioons that dictate the overall quality of a GI render

Saturation

The saturation, or the amount of surface color carried via a ray, can usually be changed to make indirect lighting more or less obvious.

It makes sense to have *some* saturation in a bounced ray even if the original light source is pure white. Light naturally picks up some of the color of the surface that it bounces off of in the real world and should be emulated accordingly.

Faking advanced lighting

Sometimes you may want to simulate more advanced lighting techniques light indirect illumination through a combination of more basic objects and tools. This may be because the basic objects will work / render faster than advanced lighting simulations or may be because you require more control over particular parts of a scene than something like a blanket global illumination pass can provide.

There are only two or three primary techniques to simulating advanced lighting effects. Each uses concepts explained in the basic lighting and texture types sections.

  • Shadowless lighting
  • Negative lights
  • Fresnel / Falloff shaders

The first two work together well while the 3rd can be used by itself. So two examples will follow.

Shadowless & negative lighting

In most programs leaving the "shadow" option either off or set to "none" will result in the light passing *through* objects. This can be used to your advantage to simulate bouncing light by placing a light without shadows at or near the center point of a intensely lit area. This means it will work best with scenes such as a singular street light, light from a window being cast onto a floor, or a flash light. Scenes with widely dispersed light will not favor as well.

Remember also that, in most programs, settings the strength / intensity / multiplier property of a light to negative values will actually remove lighting information from the area around the light. This can be used to limit overzealous lighting. Especially the kind caused by shadowless light where the light will seem to bleed "behind" objects that we actually want to cast shadows.

Let's look at an example of both ideas being used in one scene to recreate more advanced lighting effects.

We'll use a simple theatre stage set up for each of these examples. A simple floor, backdrop, cutouts, and stand-ins.

This first image will involve *one* light and have a bouncing light function turned on.

A simple scene with one light and bouncing light turned on. Note the way the light bounces up from the floor and hits the surrounding figures (from below) as well as the wall and cutouts around the stage.

Now let's look at the steps involved with trying to fake a similar image, but WITHOUT using the advanced bouncing light option that would make the scene take longer to render.

The initial step is fairly simple.

  1. Identify the surface point that has the greatest concentration of light.
  2. Place a new light near it that is of lesser brightness than the surface color.

We need to make each "bouncing" light source darker than the surface it originates from because, as in the real world, some light will always either be absorbed or disperesed with every bounce off of a new surface.

So for our example the starting point in this scene will be the primary key light, the spot light, that casts down onto the stage. The second light we add will therefore need to be close to the middle of the visible light and *not* brighter than the surface area itself.

Note the single light placed *under* the floor. This second light will have NO shadow and will have attenuation / falloff turned on to get darker fairly quickly.
The same 2-light scene when rendered. Note the appearance of bouncinge light being cast from the floor. But also note the hard edges around the various objects cause by the lack of shadows from the light added under the stage.

The next step is somewhat more challenging.

  1. Identify areas the "bounce" light should *not* be reaching.
  2. Darken these areas with negative brightness lights.

The results of the first two steps were not perfect so now we need to ctually *remove* some of the light that we've added. For this we need to place several new light around the stage at key points which have their brightness set to a negative value. Generally these areas you're looking for will fall into two categories.

  • Areas hidden behind other objects, shadows.
  • Areas where a bouncing light is not strong enough to reach as a result of light falling off over a distance.

What the actual values of these negative brightness lights need to be to achieve good results will change depending on the scene and the objects surrounding it. Much experimentation of values and positions will be required.

Here four new lights with negative brightness values have been added to areas where we want to *remove* light bleed (Note that most of them are *under* the floor plane). Depending on your program a light with a negative brightness may appear different. For instance Cinema 4D, shown here, shows the light extents as black instead of white.

To make the differences clear let's see the original image, with one light source and computer calculated bouncing light, next to the final result we obtain after having placed 1 low brightness light and 4 negative brightness lights.

The original is below and on the left. The new light setup is to the right of that.

When rendered at a resolution of 4000x2000 pixels this image, using computer-calculated bouncing light, took 45 seconds to render.
When rendered at a resolution of 4000x2000 pixels this image, using a careful arrangement of multiple lights instead of caculated bouncing light, took 3 seconds to render on the same computer.

As you can see the second image, using both positive and negative lights to simulate the effect of bouncing light, has rendered fast but has a few oddities. The fading where the backdrop meets the floor is absent and the round cylinder to the right of the characters has much harder lighting in the second version than the more realistic first version.

In the end it will be up to the artist to decide whether or not they can accept the lack of accuracy as an ok trade off for the ability to render the image faster.

Fresnel / environment shaders

Rim lighting refers to a brightening of a 3d shape around the edges from the point of view of the observer and not constant areas of the surface as with a texture.

As discussed above one factor that "sells" a scene as real is the presence of indirect lighting. This lighting doesn't have to come from one singular source however, the light cast on a floor through a window for instance, but can be caused by the scattering of light through the atmosphere itself. Simulating this effect is typically referred to by the blanket title of "rim lighting".

Just like bouncing light this effect can be achieved in a "realistic" way through hardware intensive calculations but has a less demanding, and less accurate, alternative. Nearly all 3d software and game engines will allow you to make use of two shaders to achieve this.

A "fresnel" shader, sometimes a sub-operations of a "falloff" shader, will take into account the angle of a surface compared to the camera to change surface color. (Note: the "s" is silent)

An "environment" map, similar to a "reflection" map, will typically apply color based on a pre-defined image where the part of the image used is dependent on the surface direction.

These kinds of shaders have several benefits;

  • They can easily simulate light coming from all *around* a character as opposed to a finite number of sources.
  • They can help to keep a character or object separate from the background for the sake of visual clarity (especially useful for video games).
  • Environment maps in particular have been used in the past as easy, effecient ways of simulating reflective surfaces (though they have been supplanted by sample-based reflections in modern games).

Let's look at two examples of the Fresnel shader first.

In this image from Dark Souls 2 WHICH IS A GREAT GAME YOU WHINY BABIES you can see evidence of a Fresnel / Environment shader. The boot of the character in the foreground has highlights around the sides not facing the camera. The "red phantom" on the right uses an intense fresnel falloff to give it a more supernatural look.
Pictured: Mario givin' no shits about your boxes
Super Mario World 3D, like other Mario games of the Wii era, used strong "rim lighting". It both gives the otherwise solid coloring of the characters more depth and also helps to separate them from the background during franctic gameplay.

Baking lighting effects

If you bake lighting information into an object then you'll probably want to stop lights and shadows in the scene from affecting it. A scene you want to save processing power with via baked lighting with becomes something of a puzzle. Not every rendering engine will require these rules but they will generally be the best practice.

  • Object with lighting baked into them should have "recieve shadows" turned off to prevent doubling of lighting effects.
  • Object with lighting baked into them can still have "cast shadows" turned on.
  • Be aware of where Dynamic shadows may fall. Dynamic shadows on objects with baked shadows may produce "double shadows" where the dynamic shadow appears to add to the existing shadow, making it appear even darker.

Shadow catchers

A "shadow catcher" is a object within your 3D space that shadows can fall upon but which is not otherwise visible. They are helpful when compositing images since casting shadows within a scene is one of the most important qualititets when it comes to making an image "believable".