Area lights have not been added to the code base ‘properly’, but were hacked into the code for the effect below. The basic trick is just to increase the number of pixel samples (32x in this case) and when querying the light position during the shading process, choose a random point on the light’s facing surface rather than it’s center point.
The implementation uses physically inaccurate non-uniform sampling, since I didn’t quite have the energy to dive into the probability distribution functions for the projected area of a sphere1. However, for a roughly 3 line code addition, the physically inaccurate approach was good enough to post an image:
I do intentionally refer to this functionality as area lights, not soft shadows. In this case, I prefer the terminology because soft shadows are the effect but it is area lights that are the cause.
In my mind, the term soft shadows in computer graphics refers to effects usually done in real-time graphics where an algorithm aimed at true area lights would be too computationally expensive. ‘Soft shadows’ usually implies some modulation of the shadow area itself rather than a change in the fundamental properties of the source light. The soft shadow algorithm then uses a technique that is less tied to mathematical realism in terms of the optics and more tied to improving the perceived realism.
Update: I’m realizing that I could muddle the distinction between area lights and soft shadows further by modifying the ray tracer’s implementation. The implementation used 32 light samples per pixel sample: each such light sample was used to calculate both the direct illumination value and the associated binary (0 or 1) shadow term. However, I could have chosen to use 1 sample for the direct illumination and then modulated that by a variable shadow term (0/31 to 31/31) generated from 32 samples. The effects of this alternate approach would likely be minor on the direct lighting while achieving similar softening of the shadows. Since this approach wouldn’t affect the direct illumination but does affect the shadow term, according to my own definition, would this be an area light or soft shadow implementation? I’m thinking the latter, but it’s hard to say.
1 State of the Art in Monte Carlo Ray Tracing for Realistic Image Synthesis (2001) – SIGGRAPH ’01 notes on the topic, if you’d like to know how to do it properly