Why an external host?
This page dispatches a real WebGPU compute shader and writes a storage buffer with atomic additions. Rive’s current GPU Canvas API supports vertex and fragment shaders, but not compute shaders. The ordinary Rive document above owns the preset and view buttons: its state-machine listeners change bound values, which the RIVX browser host reads to configure the compute experiment. The GPU returns a 64-bin energy profile, drawn as a bound Rive vector path. This is a two-way Rive + host-compute instrument.
That is a difference in available computation, not a claim that GPU Canvas cannot draw caustics. A different algorithm could use render passes, textures or CPU work. The Flashlight Atlas already demonstrates a render-pass approach.
What is being estimated?
A collimated disk or annular source, one spherical dielectric, its first transmitted receiver hit and three colour bands. Entry/exit refraction, Fresnel transmission and a small absorption term determine each deposit. Reflected branches and total-internal-reflection paths are discarded. The annular aperture emits a real ring of parallel rays: the separated colour rings come from their different refractive indices, not a colour overlay.
The receiver is a finite 256² grid with a small reconstruction filter and quantized positive flux. It is a biased density estimate, not a converged transport solver. The glass surface in the beauty view uses a separate bounded display shader; the caustic and both field views always read the compute buffer.