Form Factors in the Radiosity Rendering Method

Raytracing and Radiosity were the two forms of 3d rendering invented before the concept of Global Illumination and the Rendering Equation were formally introduced in the mid 1980s.

Raytracing in its most basic form means calculating the color of each pixel in the image based on the reflections and refractions of a single ray cast into the scene. In this method the color of each surface is based on the orientation to each light in the scene plus any significant rays reflected in the mirror direction or refracted through the surface.

The radiosity method acknowledges that the vast majority of surfaces do not bounce light in only one direction; if the surface is imperfect light will bounce every direction. Obviously casting a ray in every direction is impractical, instead the goal is to sum up the total light striking and leaving every surface. For those of you who remember Calculus, this is one hell of an integral.

Simply speaking, a form factor is the percentage of total energy leaving one surface that strikes another surface. This is a purely geometric problem. If you think of light reflecting off a flat surface it has to bounce somewhere away from the surface. This is a 180 degree solid angle (think of a hemisphere over the surface). If you are looking out from the surface towards another surface, some percentage of the hemisphere will be covered by the second surface. This percentage is the form factor.

If you solve for all the form factors in the scene, they can be plugged into a giant matrix and solved using numerical methods (see Gauss-Seidel). The result only shows diffuse light, and no specularity due to one major assumption: that light striking a surface reflects uniformly in all directions. Without this assumption the radiosity method is not practical because the form factors would no longer be a simple percentage coverage of a surface's 'hemisphere', it would depend on the particular placement of the second surface, and more importantly, the source of all the reflected light, which we don't know. We can't afford to worry about where the light is coming from, only where it's going to, or the elegance of the matrix solution falls apart.

Solving for Form Factors

The form factor from patch i to patch j is given by the following double integral:

Fij = 1/AiAiAj (cos φi cos φj) / (πr2) dAjdAi

    Where:
  • Ai is the area of patch i
  • r is the distance between the differential patch elements
  • φi is the angle that the line between differential patch elements makes to patch i's surface normal.

For surfaces that are sufficiently far apart you can use this definition without integration (simply use the patch areas directly and remove the integral). However, as the patches get close, the degenerate solution approaches infinity which is a huge problem since form factors greater than one indicate more than 100% of the light leaving one surface is hitting another. Solving the integral is very difficult except for very specific situations. The general solution is based on an observation called Nusselt's Analog, that the form factor of any surface is the same as the form factor of the projection of that surface onto a hemisphere surrounding the patch in question. So if we discretize the surface of the hemisphere and make it big enough that the discretized form factors (known as delta form factors) are accurate enough, we can project all other surfaces onto the hemisphere and sum up the pre-computed delta form factors for each one. Originally this was done using a cube giving rise to the Hemicube method of constructing form factors. Though less elegant than a hemisphere setup, it is easier to code for those not as comfortable with polar coordinates.