RadianceLab · Native implementation document

A fast caustic viewfinder

A deliberate approximation for revealing caustic structure quickly; compare it with the numerical sheet route.

The Fast structure preview (biased) toggle is available in analytical hourglass 20, raster-family 20 and numerical mesh-sheet 32. It is off by default. Turning it off restores the existing solver. There is no new MIS strategy ID: this is a viewfinder approximation, not an additional unbiased estimator.

This toggle is not strategy 32 itself. Normal strategy 32 constructs a finite triangulated approximation of the refracted family, builds a sheet BVH, and lets camera rays gather the sheets they cross. The toggle keeps the light-side sheet construction but replaces that camera gather with projected triangle rasterization. On strategy 20, the input geometry comes from the analytical sphere-hourglass family; on strategy 32, it comes from rays traced through the triangle mesh. The raster stage is shared, while the sheet generators are not.

The preview traces real light rays through the glass, including chains and mesh interfaces. Adjacent rays with matching interaction topology become triangular sheets. Instead of asking every camera ray to intersect a sheet BVH or solve the analytical hourglass equation, it rasterizes these triangles into a smaller image. The screen rasterizer integrates fractional triangle coverage inside each pixel, so narrow folds are retained even when no pixel center lands inside them. Color and depth use perspective-correct interpolation.

A first-solid depth buffer hides caustics behind objects. Optional glass and stage shading is ray traced at the same preview resolution. The caustic layer has its own normalized screen filter; the complete image is bilinearly enlarged for display. Its operating cost is therefore a finite light sweep, a reduced surface/depth pass and covered-pixel rasterization. It avoids the sheet BVH and per-pixel sheet crossing work. Whether that is faster for a particular scene must be measured; large projected sheets can still cause substantial overdraw.

Controls

Configuration key Default Meaning
pp.hourglassFastPreview false Opt into the approximation in 20/32/raster-family 20
pp.fastSheetScale 2 Linear downsample; 2 uses one quarter as many raster pixels
pp.fastSheetRulings 96 Initial light rays along each angular sheet
pp.fastSheetBatch 8 Independently sampled sheets per pass
pp.fastSheetBlur 1.0 Caustic filter standard deviation in raster pixels; 0 disables
pp.fastSheetMinCos 0.01 Camera tangency regularization floor
pp.fastSheetDirectFog false Add unrefracted single-scatter context

The existing meshSheetDepth, meshSheetSmoothNormals, meshSheetSurfaces and bend-limit controls still apply. Preview ray counts are independent of the reference controls. Resetting or changing a preview option clears accumulated film. Repeated passes average new light/azimuth samples; they do not eliminate discretization or filtering bias.

What changes physically

This is useful for framing a chain, finding a caustic fold, adjusting a model or inspecting how light support moves. Disable it for radiometric reference, singularity analysis, estimator comparisons or MIS variance measurements.

Reproducible checks

PrismMeshSheetTest now also checks exact projected-area integration, shared edges, subpixel sheets, projective interpolation and degenerate rejection. It is a geometry test, not evidence of unbiased rendering.

After a combined native build, run:

python docs/mesh-photon-sheets/benchmark_fast_preview.py build/fast-preview-check --before-binary C:/path/to/checkpoint/Prism.exe

The harness retains the executable hash, exact configuration, native float film, PNG and timing for every case. It first checks disabled mode 20 on scene 48 and mode 32 on scene 84 against the checkpoint, byte for byte. For the selected scene it then uses the same emission, ruling count, sheet batch, glass-interface depth and timing warmup for both paths: first-pass cost, steady-pass cost and approximately equal-render-time films. The default isolates the refracted fog so nonblack pixels cannot be explained only by stage surfaces. Add --surfaces for the complete viewfinder.

--scene selects any paired mesh scene: 83 Suzanne, 84 teapot (default), 85 spheres, 86 torus or 87 glass chain. Use a separate output root for each scene and binary; the retained-film checks reject replacing a previous run with different settings. --depth defaults to 12 glass interfaces, and --warmup defaults to two excluded steady passes. Both paths receive the same values. Initial and equal-time measurements exclude no passes, so their recorded time includes the first geometry construction.

python docs/mesh-photon-sheets/benchmark_fast_preview.py build/fast-preview-spheres --scene 85
python docs/mesh-photon-sheets/benchmark_fast_preview.py build/fast-preview-chain --scene 87 --depth 12 --rulings 96 --batch 8

The report records speed rather than assuming it. First-pass geometry setup and process launch are separate from steady rendering; approximately equal time includes a recorded pass-count cap. Compare the retained images as well as the timing ratio. No measured performance claim is implied until that report has been produced on the tested binary.