Strategy showcases · why these samplers exist →
Implementation study · volume transport · 15 September 2026
One interior.
Several ways to transport its light.
A medium changes what happens along a ray. A dielectric boundary changes which ray enters it. An estimator decides how to sample the resulting paths. Keeping these three responsibilities separate makes it possible to compare volume path tracing, cached photon mapping and connection/merging methods on the same physical scene.
Passthrough preserves direction; glass reflects and refracts.
Scattering, absorption and a phase function define the interior.
Follow collisions, connect vertices or gather light deposits.
Path averages and finite-radius photon density have different error behavior.
Correctness repair · bounded medium shadows
A volume boundary is not a solid fog ball.
The old shadow-connection helper multiplied by exp(−σₜ × distance inside the bounding shape). It never evaluated the actual SDF, noise or reaction-diffusion density. Camera paths did evaluate that density, so naive tracing could show a hollow or patterned shadow while NEE and camera-completed LT/BDPT produced a filled-in silhouette.
Shadow connections now evaluate the same base density patterns, using ratio tracking through the bounded segment. Homogeneous media retain the exact Beer–Lambert shortcut. This applies to area-light and point-light connections; the defect was not a restriction of NEE to one light type.
T = exp(−∫ σₜρ(x) dx), T̂ = ∏ⱼ [1 − ρ(xⱼ)]
Here the candidate positions form a Poisson process at rate σₜ, and the supported base density is bounded between zero and one. Empty holes contribute a factor of one. A finite number of candidates adds sampling noise, but does not turn the enclosing sphere or box into homogeneous extinction. The implementation does not impose a fixed marching-step count.
This repair covers the base procedural density models. Independently overridden scattering/absorption coefficients from advanced node graphs or decoupled slots still need their own matching extinction/majorant treatment; these are not certified by the base-density tests.
UPBP · inspect light transport
Bounded-medium photon beams, without adding global fog
Enable UPBP → Enable Medium, then Visualization → Record + Show Photon Beams. Changing the visualization requests a fresh light-path cache. The global-fog option is independent: it is not required for recording segments inside a passthrough volume box or a volume sphere behind a dielectric shell.
The old controls coupled segment storage to global fog and did not rebuild when beam visualization was enabled. A collision-only cache could therefore remain empty. Beam recording now explicitly requests light paths even when point merging is off, and the overlay searches beyond the first 500 emitted paths. The displayed beam count refers to stored segments; only a capped subset is drawn on screen.
These are diagnostic beam records. They show the sampled free-flight segments, clipped to medium boundaries, with incoming segment power before the terminal collision’s absorption/scattering weight. They do not introduce a beam-gathering or beam–beam MIS estimator. The implemented medium renderer remains collision VPT and volume-point gathering. A finite area or point emitter must illuminate the volume; the current UPBP light-path builder does not launch photons from an environment-only scene.
Bounded-medium regression
With global fog and point merging disabled, 12,000 launched paths produced 1,894 recorded segments in a passthrough cube, 803 in a passthrough sphere, and 1,483 in a sphere inside a separate glass shell. Every endpoint was checked against the medium boundary; counts matched the overlay’s path records. Turning recording off restored the collision-only cache shortcut. Existing Beer/Fresnel, scattering, photon-gathering and point-source-through-glass tests also passed.
Coverage · complementary estimators
Fill missing transport, and show who supplied it
Under Render Settings → Light Strategy, enable Fill missing transport with backup estimator. For light tracing, choose Naive PT (BSDF only) or NEE camera PT. The display can keep original colors, show the backup contribution in red, or isolate the backup. The toggle defaults off so pure estimator limitations remain visible. Pyramid display filters are paused while completion is enabled; the completion views provide the attribution instead.
This is a partition of contributions, not a repair of black pixels. A dark pixel may be physically correct or merely unconverged. Instead, camera paths contribute only when the implemented light-side strategy has no support for that path class. On the supported partition, the native estimator retains sole ownership. If χ identifies the supported subset, the construction is L = ∫χF + ∫(1−χ)F. The two domains do not overlap; no averaging of two full renders is involved.
| Selected strategy | Camera backup supplies | What remains limited |
|---|---|---|
| Camera-connection LT | Paths whose first camera scattering vertex cannot be connected by LT, including ideal glass/mirror; unsampled sky, true point sources and emissive geometry outside LT’s source pool. | A glossy receiver that LT can sample stays with LT even if its finite-sample image is noisy. This is coverage completion, not a variance optimizer. |
| Naive LT, finite aperture | Sources absent from its launch sampler, and directly visible sky. | Specular camera paths already have support through physical aperture hits, so adding an entire camera image would double count. |
| Naive LT, perfect pinhole | The camera backup supplies the entire image because random aperture hits have zero probability. | Naive PT backup still cannot hit a true point source; choose NEE for that source class. |
| Light Sample Only | Direct/specular-chain emitter hits and environment, while retaining the original shadow-sampling terms. | The camera backup does not make every delta-caustic configuration sampleable. |
| Normal NEE | BSDF hits on emitter geometries outside the sphere/quad light sampler. | Normal NEE already keeps direct and specular-chain emitter hits; a black sphere is not automatically evidence of a missing camera strategy. |
| Unavailable LT medium kernel | The selected camera backup replaces the entire kernel, explicitly labeled; red mode marks the whole replacement. | This is not heterogeneous bidirectional transport. The separate VPT fallback switch remains available when completion is off. |
The red display is a diagnostic decomposition, not physical red illumination. Native contributions keep their color and only the backup is shown as red luminance, so mixed pixels can contain both. Splats, clamping and existing approximate BSDF implementations retain their previous limitations. The partition targets the renderer’s known camera/source support; it is not a proof of completeness for every advanced material, projector, temporal filter or medium configuration.
The theoretical foundation is complementary path sampling and support-aware weighting, as described in PBRT’s bidirectional path tracing chapter. The useful addition here is an explicit coverage control and a visible attribution of the filled transport, rather than a claim to have invented estimator combination.
Validation and interpretation
The production GPU shader’s mirror scene gives a total-radiance ratio of 1.006 against the camera NEE reference without medium, and 1.035 with one homogeneous medium. These finite-sample comparisons do not establish a universal error bound. Tests also isolate the backup, verify that red coding changes only the backup channels, check perfect-pinhole replacement, reject duplicate camera contributions for finite-aperture naive LT, and exercise missing point/environment sources. These are coverage checks, not a universal performance or unbiasedness certification.
Estimator identity · deliberate limitations
What is actually rendering this image?
Allow VPT completion fallback, under Light Tracer Parameters, makes the existing fallback explicit. It defaults on to preserve the usable preview. If the active medium cannot be handled by the selected LT/BDPT kernel, the enabled fallback runs camera-side MIS/VPT and labels that fact. Disable it to obtain intentionally black unsupported output. It does not enable an unimplemented heterogeneous BDPT algorithm.
| Selected method | Perfect pinhole | Specular transport |
|---|---|---|
| Naive LT | Random rays have zero probability of hitting the ideal point aperture. Pure output is black. | Can follow specular bounces and physically hit a finite aperture; that differs from connecting an arbitrary specular vertex to a point camera. |
| Camera-connection LT | Explicitly connects to the camera point, so diffuse receivers remain visible. | Can follow glass/mirror bounces before a diffuse receiver. An arbitrary terminal ideal-specular vertex cannot be connected to the camera. |
| VPT completion fallback | Camera paths work normally. | Mirror/glass appearance can come from camera paths. It is not evidence that pure LT acquired this coverage. |
With transport completion off, pure LT discards all camera-side radiance, including volume and environment contributions that could previously leak through while surface-emitter contributions were suppressed. The UI no longer describes pure LT as “Eye: MIS + Light”. The finite-pinhole warning applies only to naive LT.
Verification
GPU regression on the RTX 4080 Laptop: eight production shadow-integration cases (vacuum, homogeneous, hollow, varying density, medium disabled and clipped segments) match independent Beer integrals within 0.009 absolute transmittance. Production rendering kernels additionally verify zero naive-LT energy at a perfect pinhole, nonzero camera-connection LT energy, zero strict unsupported output and nonzero explicit VPT completion. Both the full heterogeneous kernel and compact homogeneous BDPT kernel compile.
A true zero-area point light also differs from a small emissive sphere named “Point Emitter”. Naive camera paths cannot randomly hit a mathematical point emitter, but can hit a finite sphere or the ceiling light. A shadow visible in naive mode therefore does not by itself identify which light produced it. Compare one enabled source at a time.
For the camera-connection distinction, see PBRT’s camera importance-sampling interface.
Read the active renderer before interpreting the tiles
VPT fallback means the current medium is outside the compact BDPT kernel’s support. It is not a collection of equivalent BDPT strategies. The strategy pyramid is paused in that state and the full VPT image is shown instead. A noisy or emissive medium can select this route even when the menu still requests BDPT.
For a supported medium, the pyramid groups paths by eye/light vertex counts. Each real volume scattering event adds a vertex; null tracking events are not extra physical scattering vertices. Several strategy images can resemble one another because they estimate the same path-length contribution with different sampling constructions. The Max displayed edges slider limits the visible length range without changing the transport budget or MIS weights.
PM: enable “VPM: cached volume photons” and inspect its cache-status line. The old “No Vol” badge was stale. The current VPM cache requires homogeneous bounded media; it does not render procedural or emissive interiors. Its active status reports actual cached collision photons. Scenes 115 and 116 are controlled examples.
UPBP: CPU execution is only one cost. Each pass traces paths, rebuilds photon neighborhoods and queries them along camera paths. The standalone route no longer builds a duplicate auxiliary map; collision-only mode skips light-map work unless diagnostic light paths are requested. Point reconstruction can still be expensive and noisy, and the CPU heterogeneous density model does not reproduce every GPU volume type. These are distinct from estimator coverage. Beam estimators may reduce variance for selected transport; simply adding beams does not establish correctness or guarantee speed.
Which renderer actually handles media?
These are implementation boundaries, not theoretical restrictions on the algorithms. Merely displaying a volume mesh or beam overlay does not mean that its scattering contributes to radiance.
| Route | Volume behavior | Important distinction |
|---|---|---|
| GPU PT · naive / NEE / MIS | Explicit free-flight and scattering paths, bounded medium extinction and supported phase functions. An overlapping volume can occupy the interior of a dielectric. | The native heterogeneous path has its own density-source limitations; the matched fixtures below use homogeneous HG media. |
| GPU LT / BDPT | Light-side medium sampling is part of the PT-family implementation. BDPT additionally needs volume-compatible connection values and sampling densities. | A compact kernel for one nonemissive homogeneous-HG region avoids the NVIDIA instruction-limit failure. Its MIS includes free-flight survival, collision density and phase PDFs. Multiple regions, heterogeneous coefficients, volume emission and non-HG phase models select an explicit VPT fallback that retains the medium. Finite-aperture BDPT remains a legacy preview. |
| Photon mapper · VPM | Bakes real scattering collisions into a separate volume photon map. The GPU gathers a normalized 3D kernel along camera rays, including reflection/refraction through a smooth dielectric shell. | A finite photon kernel smooths the image. Current scope: nonoverlapping homogeneous sphere/box regions, finite area emitters and supported smooth boundaries. Heterogeneous/emissive interiors are explicitly rejected. This cache is independent of PP’s photon-point strategy. |
| UPBP | The audited bounded-medium path supports collision VPT with NEE and a separate volume-point gather. With both enabled, it averages two complete estimates; this is a 50/50 mixture, not published UPBP path-space MIS. A true point source plus specular geometry selects photon gathering for finite-source transport, since collision VPT can miss delta-source paths through glass. | The current implementation is a prototype. Stored beam segments and their overlay do not imply a beam–beam radiance estimator or the full published UPBP weighting. |
| Photon primitives | Many families are specifically designed for participating media: points, beams, sheets, volumes and refracted hourglasses. | Each family has its own supported source, boundary, scattering order and homogeneous/heterogeneous assumptions. A caustic-only family does not cover ordinary direct fog. |
| VCM, MLT, PSSMLT, path guiding, manifold prototype | The current CPU paths skip explicit volume entities. | These surface implementations do not acquire scattering merely because the scene contains a medium. Volumetric variants are possible but are separate work. |
| Raster / enhanced raster | Volume appearance or a separate photon scattering layer can be composited into the image. | This is a preview contract, not a general solution for every reflected and refracted surface–medium exchange. Layer breakdown → |
A matched native experiment
Keep the interior. Change the shell.
The new Volume boundary scene presets contain one neutral scattering sphere, a concentric surface shell, two colored Lambertian area lights and diffuse calibration blocks outside the medium. Each renderer gets the same geometry, source power, camera and exposure. The two shell variants change only the boundary material and its IOR.
| Renderer | Direction-preserving shell | Dielectric shell · IOR 1.5 |
|---|---|---|
| VPT | Scene 113 | Scene 114 |
| Cached VPM | Scene 115 | Scene 116 |
| UPBP | Scene 117 | Scene 118 |
The fixtures reset display filters, photon selection and progressive-radius settings. PT, PM and UPBP use a 12-bounce budget; selecting compact BDPT imposes its smaller, shared eight-event maximum. Match that lower cap explicitly when comparing BDPT.
The homogeneous interior has radius 1.38, σs = 1.2, σa = 0.08 and HG g = 0.35. The smooth shell has radius 1.4. Its small separation from the medium boundary avoids coincident-hit ambiguity. It represents one dielectric interface enclosing a scattering interior; it is not a hollow glass bottle with an additional inner glass–liquid interface.
There is no world fog, environment illumination, hidden point source or volume emission. If the space around the spheres fills with mist, that is an accounting error. The medium remains active after a camera or photon ray refracts through the shell; “currently inside glass” must not suppress a separately declared overlapping volume.
How to make the comparison informative
- Load a paired scene and keep its authored settings. For BDPT, start from 113 or 114, keep Volume Medium enabled, and choose BDPT with Balance or Power on a perfect pinhole. The legacy participating-media showcase switch is not required for the compact kernel.
- Compare both equal elapsed time and converged linear radiance. Equal sample count alone hides the cost of connections, cached photons and gathers.
- Inspect the interior separately from the calibration blocks. Directly illuminated diffuse blocks test normalization; the sphere tests scattering and boundary crossing.
- For VPM, increase photon count while reducing the kernel radius. A blurry image is not necessarily darker transport; finite-radius leakage and missing transport are different failures.
- Test zero scattering, then pure absorption, then scattering. At zero extinction the passthrough sphere should vanish; glass should remain refractive.
- Record path-depth limits. A dense medium can require many scattering events; a short hard cap is a truncated transport model even when its individual weights are correct.
Interactive schematic · unscattered transmission
Refraction changes the path through the same medium.
The rays below obey Snell’s law at the sphere. Their straight interior branch is attenuated by exp(−σtℓ); the transmitted dielectric branch also loses Fresnel-reflected energy. The schematic omits those reflected rays and every scattered branch. Their absence here is a drawing choice, not absorption.
σt = σs + σa · T(ℓ) = e−σtℓ
The bright medium disk indicates the scattering domain, not a calculated radiance image. The native presets above perform the actual transport calculation, including the paths omitted by this schematic.
Material model versus transport phenomenon
Is subsurface scattering different from glass with medium inside?
Subsurface scattering is the phenomenon: light enters an object, scatters internally and leaves, often at another position. An explicit dielectric boundary plus a participating interior can model it directly. Glass without internal scattering is a different case: it bends light and may absorb it, but does not generate volume scattering by itself.
Explicit interior paths
Trace Fresnel reflection/refraction at entry and exit, sample distances to interior collisions, apply the phase function and account for absorption. This can retain thin-region transmission, low-order scattering, internal reflections and detailed geometry. Optically thick objects may need long paths.
Diffusion / BSSRDF shortcut
A BSSRDF describes transport between surface entry and exit points without explicitly constructing every interior event. A diffusion model is most appropriate after many scattering events; it is less reliable for thin layers, small optical thickness and strongly directional transport.
The classic Jensen–Marschner–Levoy–Hanrahan model combines a single-scattering term with a dipole diffusion approximation for multiple scattering. Its approximation is a different estimator/model choice, not the definition of SSS.
What RadianceLab’s existing “Dipole SSS” material actually does
The GPU material named Dipole SSS uses a simplified sphere-only diffusion-style hop. It samples shell reflection, forms reduced scattering σ′s = (1 − g)σs and a diffusion scale, samples an exponential lateral travel distance, rotates that distance onto the sphere, then samples a cosine-weighted outgoing direction. A tint and approximate Fresnel/diffusion factor scale the result.
This is not the complete published dipole BSSRDF: it does not evaluate the real/virtual-source dipole profile and does not trace an interior random walk. Its sphere lookup also depends on the material index, so one material should belong to one sphere. The explicit medium-in-glass fixtures use a Glass material and a separate VolumeSphere instead. They do not invoke that shortcut.
The raster screen-space SSS blur is a third, appearance-oriented approximation. Neither its attractive glow nor the diffusion material’s label establishes agreement with the explicitly transported interior.
Three estimators, three useful views of the same integral
VPT follows collisions
Each ray chooses whether and where a collision occurs. Survival, scattering density, phase sampling and source sampling have to match their contribution weights. Sampling from a free-flight exponential already accounts for part of transmission; multiplying by the same attenuation again darkens the estimate.
VPM reconstructs from deposits
Light paths leave volume photon records. The camera queries a three-dimensional neighborhood, applies the incoming-direction phase factor and reconstructs in-scattered light. A volume kernel normalizes in units of 1/volume, not the 1/area used by a surface photon map.
Coverage comes before combination
A point emitter behind a specular boundary is a useful warning. Collision VPT with ordinary next-event connections cannot produce the required bent delta-source connection, while emitted photons can refract through the shell and then scatter. Averaging those estimates would halve that missing component. When true point sources and specular geometry coexist, this prototype therefore selects photon gathering for finite-source transport if it is enabled. Collision VPT alone remains incomplete for those paths. This conservative rule is not a replacement for a complete path-space MIS implementation.
UPBP combines complementary sampling constructions
The published Unifying Points, Beams, and Paths method combines volumetric density estimates and path sampling with a common weighting framework. The benefit comes from complementary sampling behavior: one representation can find transport that another estimates with high variance. Our current prototype’s implemented subset is stated separately; a name or a beam visualization is not evidence that the entire published algorithm is present.
Likewise, PP’s photon-point strategy and cached VPM are related density-estimation ideas with different execution contracts. The latter deliberately retains a light-side cache for reuse across camera queries. Sharing an underlying kernel idea does not make their cache lifetime, cost or sampling distribution identical.
Validation record
The scene catalogue regression passes 835,669 geometry, source, medium and paired-mode checks, including all six new fixtures. It checks identical geometry and illumination across estimators, a strictly enclosed homogeneous interior, matching CPU/GPU area-light records and the authored camera settings.
GPU BDPT · homogeneous HG regression
A small analytical scene contains one bounded homogeneous medium with σs = 0.35, σa = 0.07, g = 0.3 and radius 3, plus diffuse receivers and a finite emitter. The common depth cap is two. Production shaders link on the NVIDIA GPU that previously rejected the combined shader for too many instructions.
| Estimator | Samples per pixel | Mean linear radiance | Difference from reference |
|---|---|---|---|
| Naive VPT reference | 8,192 | 0.0375578 | — |
| VPT with MIS | 256 | 0.0375034 | −0.14% |
| BDPT balance | 2,048 | 0.0382140 | +1.75% |
| BDPT power | 2,048 | 0.0382386 | +1.81% |
| BDPT balance · four light paths/pixel | 512 | 0.0384200 | +2.30% |
These are finite-sample mean-energy checks, not equal-time benchmarks or proofs for every material. Advanced material models, overlapping media and unsupported density fields remain separate validation questions. The new check also exposed and fixed a terminal medium-bounce accounting error in the VPT reference path.
GPU PT · medium inside glass
An axial pure-absorption test uses σa = 0.4 through a diameter-two interior. At IOR 1, GPU PT returns 0.451073 against Beer–Lambert’s 0.449329. With a smooth IOR 1.5 shell, it returns 0.415619 against the near-axis Fresnel/transmission reference 0.414235, including repeated internal reflections. The error is under 0.4% in both cases. This checks explicit volume occupancy and attenuation through a dielectric; it does not certify every BDPT refractive density.
UPBP’s audited CPU medium path
The production CPU routines are checked against independent Beer–Lambert and single-scattering references. Here “VPM” means the volume-point component inside UPBP; the main photon-mapper mode has its own cache and validation.
| Test | Reference | Measured |
|---|---|---|
| Absorption · passthrough sphere | 0.449329 | 0.450511 |
| Absorption · IOR 1 shell | 0.449329 | 0.448367 |
| Absorption + IOR 1.5 glass · attached interior | 0.414235 | 0.413256 |
| Absorption + IOR 1.5 glass · separate shell | 0.414235 | 0.411089 |
| Conservative scattering under uniform unit sky | 1 | 1.00083 |
| Single scattering · collision VPT | 0.00501226 | 0.00500194 |
| Single scattering · volume points, radius 0.15 | 0.00501226 | 0.00484135 |
| Single scattering · 50/50 complete-estimate mixture | 0.00501226 | 0.00492791 |
Doubling geometry, halving extinction and scaling point-source intensity by four changes the volume-point result from 0.00484135 to 0.00483382, consistent with the three-dimensional kernel normalization. A multiple-scattering glass test with a finite sphere emitter gives 0.0195114 for VPT and 0.0191523 for volume points at radius 0.16. The finite kernel retains smoothing and boundary bias; its single-scattering estimate is about 3.4% below the independent quadrature at the tested radius.
The single-scattering point maps use four batches of two million photons; the glass test uses four batches of 500,000. A separate point-source → glass → fog regression returns zero for collision VPT, 0.00551507 for point gathering, and exactly the same 0.00551507 with both enabled: the coverage safeguard avoids losing half the energy. These controlled CPU regressions validate the implemented subset. They do not validate beam–beam merging or establish that this prototype reproduces the complete published UPBP algorithm.
Cached PM-mode VPM
An independent homogeneous-slab single-scattering integral predicts total deposited flux 0.0826434; the baked photon map produces 0.0827497 (0.13% difference). A second bake verifies normalization across accumulated batches. Pure absorption leaves no scattering deposits, and unsupported heterogeneous inputs are rejected.
The production GPU gather shader links and renders both shell variants. A 140,000-path bake stores 81,679 scattering deposits with the direction-preserving shell and 146,643 with glass, including repeated interior events. Deposits stay within the declared medium and all inspected pixels are finite. These checks establish a working camera gather through the shell; they are not an equal-time image-quality benchmark against VPT.
Implementation sources and reproducibility
Scene builder: src/scene/ScenePresetShowcases.cpp. Catalogue: src/scene/ShowcasePresets.h. Fixture regression: tests/test_showcase_scenes.cpp. Explicit GPU transport and the legacy SSS branch: shaders/pathTrace.comp. Separate CPU estimators: PhotonMapper.cpp and UPBPIntegrator.cpp.
Build and run PrismShowcaseTest, PrismVPMTransportTest, PrismUPBPMediumTest and PrismBDPTGPUTest --volume-test from the working build-local tree. The pre-change checkpoint for this work is checkpoint/volume-transport-2026-09-15. No renderer backup copy is modified.