This is my 4th contribution to flipcode's IOTD,
although the last one was more than a year ago :)
I've been working on real-time soft shadows during
my free time recently, and couldn't resist posting
an image of my results.
The technic is based on a render-to-3D texture
approach. It's based on an extension of shadow
volumes, which means it handles self-shadowing and
point lights perfectly. In a first pass i render the
shadow volumes to the first depth of a 3D texture, and
i then blur the next depths recursively in hardware.
When it's done, i calculate a "sharpness" coefficient
per-vertex, which takes into account the distance to
the viewer and to the light, and i render the scene
again, with the full lighting equation, modulated
by the 3D "shadow map", which i sample based on the
It's not perfect, but the results look pretty decent.
The demo from which these images were taken only
works on a Radeon 8500+, and run at 15-20 fps average
on an Athlon 1.4 Ghz. It uses vertex shaders and
pixel shaders, for shadow volumes extrusion, dot3
bump-mapping, specular and gloss-mapping. The CPU is
almost idle, if it wasn't for rendering the
environment bump-mapped water (requires
render-to-texture too). The bottleneck is coming from
fillrate, but surprizingly, not from the soft shadows
part. Tested with standard shadow volumes, the demo
runs at 20-25 fps average, which means the soft shadows
is only slowing it down by 20-25%. The scene is not
very complex, but also not obvious (around 15k tris).
Two DIVX videos are available on my website:
I'll try to post the executable in a few days, plus
some source code. No Geforce 3/4 convertion is planned
at the moment (no time!).