I love raytracing. It is one of the most fabulous and fascinating things a powerful computer can do… and raytracing keeps on getting better and better. However, one of the biggest limitations of Blender’s Default Raytracer, “Cycles”, has always been its lack of caustics tracing capabilities. I assume that if you clicked on the title of this blog, you already know what caustics are so I’ll waste little time describing them. Caustics are the fun ways that light bends through refractive objects causing light rays to change direction. The most commonly recognizable example of this in the real world is easily how sunlight bends off the waves of a swimming pool. To achieve this effect in the Cycles renderer, usually required cumbersome tricks… but not anymore.
Since caustics traditionally didn’t work in Cycles, I often opted to use Lux Core Renderer with Blender, however, switching to Lux Core meant completely altering all the shader trees for every object I imported, creating unnecessary work. Furthermore, Lux Core integration was imperfect, and I became frustrated with bugs that prevented shader parameters from animating.
Frustrated by all of it, I decided to take a step back and give the devs time to catch up. It seems they are working very hard these days, because, if you get a specific PATCH Build of Blender right now, you can test out a new Caustics feature for Cycles that works pretty well, however is still very much pre-alpha.
Blender Patch D13533, posted December 20, 2021, is the only build that I currently know of that possesses this feature, and since it is a patch build, expect some issues. In particular, do not enable volume scattering! I’ve found that enabling Volume Scattering and Caustics together is virtually guaranteed to crash Blender every single time (save often). But beyond that, I haven’t had any issues with crashes, and have been playing around with some pretty neat effects, but not quite as dramatic as what is available from a bidirectional rendering engine (such as LuxCore). Obviously having caustics and volume scattering would be very complimentary, so let’s hope they eventually work out the glitches and get this much-anticipated feature to release status.
Limitations Allow for Reasonable Rendering Times
One limitation of the cycles approach (which may change before release) is that caustics will not fall upon any object that is not specifically flagged as a caustic receiver. Caustics also not be cast through any object not flagged as a caustic caster, nor from any light not flagged as a caustic light, but I believe area lights and even emissive shaders are supported… a welcomed addition. When I initially started playing around with it, I put a cube on a plane but forgot to mark the plane as a caustic receiver. It wasn’t until the casters, receivers, and lights were all properly flagged before I saw caustics rendered.
This flagging limitation creates a few extra steps but is somewhat welcomed, however, as caustic calculations are crazy expensive to render. LuxCore seems to spend an eternity rendering dark scenes with lots of caustics, particularly if there’s volumetric fog involved… but the way cycles explicitly flags objects both as casters and receivers should allow for an optimal balance between performance and appearance.
As you can see above, enabling caustics makes quite a difference. The above gallery contains the same scene recreated in both Cycles and LuxCore. Note than in order to duplicate the scene in LuxCore, all the materials had to be recreated and don’t have exactly identical material properties, but the basic materials, such as “glass” and “mirror” are pretty basic. The lights have different properties as well in LuxCore vs. Cycles… so these scenes aren’t an exact match, but good enough.
There are two lights, one inside the glass heart, and another between the sphere and the monkey which is pointed at a concave mirror… this light seems to misbehave in both renderers (possibly a blender optimization bug?… still investigating. For some reason, one of the lights looked far better/different in the viewport vs the final render, and I’m convinced that Cycles was completely unable to render a spotlight bounced off a mirror.
The caustics in LuxCore are considerably more dramatic. But these initial tests show promise. They were rendered with a 3-minute time limit on a 32-core Threadripper 2990WX then denoised.
How to Try out Caustics in Blender 3.1 Patch D13533
Step 1 – Get The Patch Build
Step 2 – Enable Optix in Edit->Preferences->System (HIP might also work)
Step 3 – Set the Caustic Light Property to lights that will cast caustics.
Step 4 – Set the Caustic Caster Property to Objects that will cast caustics.
Step 5 – Set the Caustic Receiver Property to Objects that will receive caustics.
Step 6 – Save Often… and do not enable volume scattering (will crash)