[Radiance-general] New occlusion testing optimization
Greg Ward
[email protected]
Wed, 31 Dec 2003 12:50:02 -0800
I just checked in a new optimization for light source testing that
seems to speed renderings up by about a factor of 2, depending on the
number and arrangement of light sources in the scene. There is no
command-line option associated with the algorithm, as it is strictly a
time vs. memory trade-off, and a pretty good one at that. Using the
default cache resolution of 20x20, the memory cost is a little over 4
Kbytes per light source, so a scene with 100 sources will take an
additional 400 Kbytes of memory during rendering. This seems like a
small price for a doubling in rendering speed, so I decided not to make
it a runtime option. (You can add a -DSHADCACHE=0 compile option if
you really want to switch it off, or use -DSHADCACHE=40 if you want to
use 4 times as much memory for even faster renderings.)
The way it works is simple: with each light source, we associate an
array of SHADCACHExSHADCACHE OBJECT indices listing occluders in each
direction as seen from the source. Each time we're about to test for
shadows, we first check against the cached occluder. Since it doesn't
matter where in the path a surface occludes the source, we don't really
have to trace a ray to find the first blocker -- any blocker will do.
If the cached occluder does not block the point being tested, but
another blocker is found for this point, then the new blocker replaces
the previous one in the cache. This tends to save the largest
occluders over time, since they'll have better cache longevity.
This is actually a very old and widely used technique for reducing
shadow tests, but the way it is implemented in most ray tracers is to
store just one blocker per source -- the most recent. This of course
doesn't work if your test points are randomly distributed in your
scene, as they are during most Radiance renderings by the indirect
(ambient) calculation. My earlier test of this simpler approach many
years ago showed no improvements in rendering time. So, the innovation
here use an array of recent occluders per source, which works for any
sample ordering provided the shadows in the scene are not caused
entirely by teeny obstructions. (Shadows cast by the leaves of a tree
will not be sped up much by this technique.)
The way I implemented it in Radiance, it tends to improve the accuracy
of the -dt and -dc settings, even when it does not substantially reduce
the rendering time. Also, it allows you to specify -dt 0 without
incurring nearly as great a cost as it used to for those who need the
utmost in accuracy. Since the occlusion cache does not introduce any
errors (at least none that I've seen), you can get 100% reliable source
tests at a fraction of the expected cost.
I'm hoping that some of you will download tomorrow's HEAD release and
give it a try. I have only experimented with it extensively on one
(rather complicated) scene, so I'm curious what effect it has on
others.
Happy New Year everyone!
-Greg
P.S. Rob's latest post makes it sound like he's taking after me --
forgetting what he's said as well as what he knows!