Models diffuse reflection = indirect diffuse lighting.


Direct lighting only takes into account sources. Radiosity accounts for diffuse reflections of everything in the scene.


Diffuse: an object reflects off in all directions, not just one like in specular (raytracing accounts for that)

Energy Transfers

By dividing the scene up into small patches and calculating the energy transfer between patches we can do a reasonable job at indirect diffuse lighting.


// Energy transfer equation. p is the diffuse reflection coefficient//

Light Input to a Patch


A patch receives input to the sum of the output of all the other patches.


Form Factors


Form factors depend on the shapes of each patch, the distance between them and the relative orientation of each patch

We can use the above equation, but it’s difficult (and doesn’t take occlusion (hidden surfaces) into account). So instead we have the Nusselt Analog.

Nusselt Analog

  1. Render the scene from the patch’s point of view onto a unit hemisphere
  2. Project the hemisphere orthographically onto a unit circle
  3. Divide by the area of the circle

Hemicube Method


If we instead render onto a hemicube and weight the pixels for distortion

Solving the Energy Transfer


We could use a lot of matrix math to do this, or we can iteratively update the radiosity values with multiple passes.

Iterative Approximation



Progressive Refinement

The iterative approach is inefficient as it spends a lot of time computing inputs from patches that make minimal or no contribution.

Instead we prioritise patches by light output (as these will contribute the most to the scene).


To do this we can work out the form factor for light sent from i to j, rather than light received at j from every i (which is what Nusselt’s Analog does).