The way that light reflects off diffuse and specular objects is very different. The result of this, without going into the microscopic reasons, is that diffuse reflections are uniform regardless of the incident angle, while specular reflections are concentrated around an excident angle opposite the normal of the incident angle. Because of this a normal form factor can not be used for light distribution from specular reflections.
Using a normal form factor light from a light source falls off with d^2 where d is the distance from the light source. This is appropriate for diffuse reflections, and non directional light sources because it assumes that light emmits from the source with equal intensity in every direction. For a specular reflection though this is not the case. Therefore we have to change this equation so that it doesn't fall off with d^2.The standard form factor we are using for diffuse reflections is:
ff = ( | (n1 dot dir) * (n2 dot dir) | * A ) / ( pi * d^2 ) where: n1 is the normal of patch 1 n2 is the normal of patch 2 dir is the direction from patch 1 to patch 2 A is the area (patches 1 and 2 have similar areas) d is the distance between patchesAnd our form factor for specular reflections is:
sff = ( | n dot dir | * d1^2) / (d2^2) where: n is the normal of patch reciving the light from the reflection dir is the direction from the reflecting patch to the reciving one d1 is the distance between the two patches d2 is the total distance from the last diffuse reflection for the light, so if the light bounces off multiple specular objects this distance will be the sum of all of the distances between those patches.
This new form factor remains unitless, like the diffuse form factor, but does not fall off with d^2 for every specular surface it hits. Instead it maintains the same falloff as the last diffuse surface that was intersected. This is done through multiplying by the current distance, and dividing by the new sum. The angle of the light excident from the specular surface is also not important, so the second cosine term is dropped. And the area is also no longer important because the area of all patches is assumed to be the same (We should multiply by one patch area, and divide by the other, but because they are the same they can be left out of the final equation).