Glass transmission fake caustic on floor plane (shadow_matte)
Arnold is a unidirectional path tracer and therefore realistic caustics can be expensive to render. This is because caustic effects create a lot of noise and require very high sampling values, which can lead to long rendering times. This tutorial shows how to create a fake caustic effect that is far cheaper to render but still looks convincing. It uses a combination of the ray_switch, standard_surface, and facing_ratio shaders and assigns them to the object that emits caustics. A shadow_matte shader is then assigned to the floors standard_surface.emission attribute that gives the caustic effect.
It should be noted that the technique in this tutorial is not physically correct and does not demonstrate the result of a physically correct caustic effect. However, in most cases, the rendered results should be sufficient to fool the eye. Thanks to Slava Sych for his help with this tutorial.
![]() |
![]() |
![]() |
![]() |
The shader can be downloaded here.
Information about rendering true caustics can be found here.
Place the object that you want to emit caustics from in the scene. Create a camera and set the desired position. Create a floor plane to sit under the object.
Create a distant_light (directional). Increase its exposure to 3, angle to 3 and samples to 3.
distant_light (directional)
specular_IOR : 1.550
transmission_weight : 1.0
coat_weight : 1.0
coat_roughness : 0.1
coat_IOR : 1.550
Enable transmit_aov so that you can render out separate caustic AOVs.
transmission_weight : 1.0
Enable transmit_aov
Create a facing_ratio shader and connect its output to transmission_weight of the ShadowGlass shader.
The facing_ratio parameters used will be dependent on the particular object that you are using and therefore may need to be adjusted.
Gain: 0.619
Enable Linear
Enable Invert
facing_ratio -> standard_surface (ShadowGlass)
Next, create a ray_switch shader and assign it to the object. Rename it to GlassMat. This will be used to tell Arnold which rays to use when rendering the glass object.
Connect the CamGlass shader output to the camera, diffuse_reflection, diffuse_transmission, specular_reflection , and transmission parameters of the GlassMat (Ray Switch) shader.
Connect the ShadowGlass shader output to the shadow parameter of the GlassMat shader.
Ray Switch shader
Specular Roughness : 0.2
to the emission_color of the FloorMat shader.
Shadow Matte :
Background Color : 0.0 0.0 0.0
Shadow Color : 1.0 1.0 1.0
Shadow Opacity 1.0
Backlighting : 0.0
Enable: Alpha Mask
Diffuse Intensity : 0.0
Range:
ColorCorrect:
shadow_matte -> range -> color_correct -> FloorMat (standard_surface)
When using a skydome_light, there are some steps required to not break the caustic effect.
This light is to be used for lighting the Glass material itself and is not required for the caustic effect. You may need to break light linking between the skydome_light and the floor plane otherwise the caustic effect may not be visible properly. If you need lighting from a background with HDRI, try creating a second skydome_light and break its light linking with the glass object.
Scene setup with skydome_light . Glass object is better lit.
Now the scene is ready to set up render layers for AOV compositing. These can be used to fine-tune the caustics, add dispersion effects, etc.
![]() |
![]() |
![]() |
Caustic layer | Glass layer | Precomp version |
Increasing the specular_ray_depth will create more reflective bounces in the glass object and give a more realistic result. Note that increasing this value will increase render times.
Glass shader (left). Floor shader (right).