Viable Caustics Solution For Cycles Raytracer that you can TEST RIGHT NOW in Blender 3.1

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.

Blender Caustics with Cycles
Blender Caustics Patch in Action: This scene is lit with lights entirely inside the glass heart, one light in each colored section, casting caustic rays outward.

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.

Comparisons

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 2Enable Optix in Edit->Preferences->System (HIP might also work)

Step 3Set 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)

Some Examples from my Experiments

A scene lit from inside a glass of whiskey.
More Blender Caustic Lighting Experiments
Testing out lighting from inside Wine Bottles with Blender 3.1 Caustics

0 Replies to “Viable Caustics Solution For Cycles Raytracer that you can TEST RIGHT NOW in Blender 3.1”

  1. Sounds like quite the step up for Blender, indeed! The Cycles renderer’s newly introduced caustics capabilities sure seem exciting. The limitation in the flagging of objects as casters and receivers might be a tad inconvenient, but as you’ve pointed out, it’s somewhat justified given the computational intensity of rendering caustics. On another note, the glass and mirror materials in the comparison image have piqued my curiosity; they really look quite different in Cycles vs LuxCore, don’t they? Curious to know if such differences are a result of the material properties or the way each renderer handles light interactions. So, do the respective rendering engines interpret these basic materials differently in your experience? Have you come across any discrepancies in other common materials as well?

    1. Heya Grace, you nailed that question! I’ve pondered the same thing–how does the rendering engine interpret different materials? For example, would metal look different in LuxCore compared to Cycles? Is the light absorption and reflection fundamentally different in both? So many fascinating angles to explore. I’m keen to learn more too!

      1. Ooh, metals, now we’re talking texture! Each renderer definitely has its own flavor for sure. When I tweak metals in Cycles, the reflection and glossiness can be a little more, let’s say, “predictable”. LuxCore throws curves with its physically accurate algo thingies – gotta watch it like a hawk! But that realism LuxCore nails, sometimes it gives that extra oomph of believability, you know? Ever dived deep into a renderer and found it giving you the cold shoulder with certain materials? Cycles can be snippy with complex transparencies, gets all muddled up, lol.

        1. Absolutely, the difference is fascinating! Cycles can be finicky with complex transparencies, no doubt. And yes, LuxCore’s realism can be a double-edged sword – more accurate but sometimes harder to control. Anyone found a trick to balance ease of use with realism?

          1. Have you tried setting different render samples for better control?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.