Integrators

Transient Path (transient_path)

Standard path tracing algorithm which now includes the time dimension.

Note

If you want to simulate a Non-Line-of-Sight (NLOS) setup, look into the transient_nlos_path plugin, which contains different sampling routines specific to NLOS setups that greatly increase the quality of your results.

Note

This integrator does not handle participating media. Instead, you should use our transient_prbvolpath plugin.

<integrator type="transient_path">
    <integer name="max_depth" value="8"/>
</integrator>

Parameter

Type

Description

Flags

camera_unwarp

boolean

If True, does not take into account the distance from the camera origin to the camera ray’s first intersection point. This allows you to see the transient video with the events happening in world time. If False, this distance is taken into account, so you see the same thing that you would see with a real-world ultra-fast camera. (default: false)

temporal_filter

string

Can be either: - ‘box’ for a box filter (no parameters) - ‘gaussian’ for a Gaussian filter (see gaussian_stddev below) - Empty string to use the same filter in the temporal domain as the rfilter used in the spatial domain. (default: empty string)

gaussian_stddev

float

When temporal_filter == ‘gaussian’, this marks the standard deviation of the Gaussian filter. (default: 2.0)

block_size

integer

Size of (square) image blocks to render in parallel (in scalar mode). Should be a power of two. (default: 0 i.e. let Mitsuba decide for you)

max_depth

integer

Specifies the longest path depth in the generated output image (where -1 corresponds to \(\infty\)). A value of 1 will only render directly visible light sources. 2 will lead to single-bounce (direct-only) illumination, and so on. (default: 6)

rr_depth

integer

Specifies the path depth, at which the implementation will begin to use the russian roulette path termination criterion. For example, if set to 1, then path generation many randomly cease after encountering directly visible surfaces. (default: 5)

Transient Volumetric Integrator (transient_prbvolpath)

This integrator is very similar to transient_path but mainly it handles participative media (e.g. fog, smoke, etc.).

Note

You might want to look at our tutorial for how to set up a scene for this plugin with participative media (medium plugins) on the transient rendering section of our tutorials.

This class implements a volumetric Path Replay Backpropagation (PRB) integrator with the following properties:

  • Differentiable delta tracking for free-flight distance sampling

  • Emitter sampling (a.k.a. next event estimation).

  • Russian Roulette stopping criterion.

  • No projective sampling. This means that the integrator cannot be used for shape optimization (it will return incorrect/biased gradients for geometric parameters like vertex positions.)

  • Detached sampling. This means that the properties of ideal specular objects (e.g., the IOR of a glass vase) cannot be optimized.

See the paper “Path Replay Backpropagation: Differentiating Light Paths using Constant Memory and Linear Time” (Vicini et al. 2021) for details on PRB and differentiable delta tracking.

<integrator type="transient_prbvolpath">
    <integer name="max_depth" value="8"/>
</integrator>

Parameter

Type

Description

Flags

max_depth

integer

Specifies the longest path depth in the generated output image (where -1 corresponds to \(\infty\)). A value of 1 will only render directly visible light sources. 2 will lead to single-bounce (direct-only) illumination, and so on. (Default: 6)

rr_depth

integer

Specifies the path depth, at which the implementation will begin to use the russian roulette path termination criterion. For example, if set to 1, then path generation many randomly cease after encountering directly visible surfaces. (Default: 5)

hide_emitters

boolean

Hide directly visible emitters. (Default: no, i.e. false)

Transient NLOS Path (transient_nlos_path)

Standard path tracing algorithm which now includes the time dimension, and contains multiple sampling routines specific to non-line-of-sight (NLOS) scenes.

Based on: [Royo2022] Royo, D., García, J., Muñoz, A., & Jarabo, A. (2022). Non-line-of-sight transient rendering. Computers & Graphics, 107, 84-92.

Note

You might be interested in using y-tal for simulating NLOS scenes. y-tal can handle the creation of NLOS scenes and calibration data (e.g. laser and sensor positions, bin time, etc.). y-tal also implements multiple NLOS reconstruction algorithms. You can check its GitHub page here.

Warning

Make sure to use “box” spatial + temporal filters with this plugin (you can see how to set up a box filter in the documentation of this plugin) which is probably the behaviour that you expect with NLOS scenes.

Here we show two example configurations of this plugin. You might want to choose the first one if you want to measure third-bounce illumination (i.e. single-corner NLOS setups). If you want to measure higher-order bounces (e.g. looking around two corners such as in [Royo2023]), you might want to choose the second configuration. Both configurations converge to the same solution, although the first one is faster for third-bounce illumination.

[Royo23] Royo, Diego, et al. “Virtual mirrors: Non-line-of-sight imaging beyond the third bounce.” ACM Transactions on Graphics (TOG) 42.4 (2023): 1-15.

  1. Single-corner NLOS setups (faster simulation for third-bounce illumination).

<integrator type="transient_nlos_path">
    <boolean name="nlos_laser_sampling" value="true"/>
    <boolean name="nlos_hidden_geometry_sampling" value="true"/>
    <boolean name="nlos_hidden_geometry_sampling_includes_relay_wall" value="false"/>
    <string name="temporal_filter" value="box"/>
</integrator>
  1. For higher-order bounces (e.g. looking around two corners).

<integrator type="transient_nlos_path">
    <boolean name="nlos_laser_sampling" value="true"/>
    <boolean name="nlos_hidden_geometry_sampling" value="true"/>
    <boolean name="nlos_hidden_geometry_sampling_includes_relay_wall" value="true"/>
    <string name="temporal_filter" value="box"/>
</integrator>

Parameter

Type

Description

Flags

filter_bounces

integer

Only account for paths of specific number of bounces in the result. A value of 1 will only render single-bounce (direct-only) illumination 3 will lead to three-bounce (single-corner) illumination in NLOS setups And so on. A value of -1 disables this feature (default: -1 i.e. disabled)

discard_direct_paths

boolean

If True, paths with only 1 bounce (direct illuminations) are discarded. If False, this parameter does not have any effect. (default: false)

account_first_and_last_bounces

boolean

if True, the first and last bounces are accounted in the computation of the optical path length of the temporal dimension. This makes sense if you think of a NLOS setup. If False, the first and last bounces are not accounted (useful!) (default: false)

capture_type

string | int

‘Single’ (or 1) performs an NLOS capture with only one illumination point. ‘Confocal’ (or 2) performs a capture with the same number of illumination and scanned points, where the laser always aims at the current scanned point. In ‘Exhaustive’ (or 3) captures, each time the sensor scans a point the laser illuminates its complete grid. See also transient_hdr_film and its exhautive_scan parameter. (default: ‘Single’)

force_equal_illumination_scanning

boolean

Forces the illumination points to be the same as the scanned points, ignoring ‘laser_illumination_resolution’ even in ‘exhaustive’ captures. (default: true)

illumination_scan_fov

float

Used only for ‘Exhaustive’ captures (see capture_type), and only when force_equal_illumination_scanning is false. This value represents the horizontal field of view (FOV) in degrees of the illuminated scan area. If force_equal_illumination_scanning is true, the points illuminated in the scene will be obtained by tracing a grid of rays beginning at the emitter, equally spaced in the scan area defined by this FOV. (default: 20)

nlos_laser_sampling

boolean

If False, lights are sampled using Next-Event Estimation. If True, lights are sampled using the Laser Sampling technique. See [Royo2022] for more information about Laser Sampling. (default: false)

nlos_hidden_geometry_sampling

boolean

If False, ray directions are sampled using material properties. If True, ray directions are sampled using the Hidden Geometry Sampling technique. See [Royo2022] for more information about Hidden Geometry Sampling (default: false)

nlos_hidden_geometry_sampling_do_rroulette

boolean

Only relevant when nlos_hidden_geometry_sampling is True. If False, always uses the Hidden Geometry Sampling technique to sample new directions. If True, uses Russian Roulette to choose between 50% Hidden Geometry Sampling and 50% Material Sampling. See [Royo2022] for more information about Hidden Geometry Sampling (default: false)

nlos_hidden_geometry_sampling_includes_relay_wall

boolean

Only relevant when nlos_hidden_geometry_sampling is True. If False, points in the relay wall cannot be sampled using the Hidden Geometry Sampling technique. If True, points in the relay wall can be sampled. See [Royo2022] for more information about Hidden Geometry Sampling (default: false)

temporal_filter

string

Can be either: - ‘box’ for a box filter (no parameters) - ‘gaussian’ for a Gaussian filter (see gaussian_stddev below) - Empty string to use the same filter in the temporal domain as the rfilter used in the spatial domain.

IMPORTANT: RECOMMENDED TO SET TO ‘box’ FOR NLOS SIMULATIONS. (default: empty string)

block_size

integer

Size of (square) image blocks to render in parallel (in scalar mode). Should be a power of two. (default: 0 i.e. let Mitsuba decide for you)

max_depth

integer

Specifies the longest path depth in the generated output image (where -1 corresponds to infinity). A value of 1 will only render directly visible light sources. 2 will lead to single-bounce (direct-only) illumination, and so on. (default: 6)

rr_depth

integer

Specifies the path depth, at which the implementation will begin to use the russian roulette path termination criterion. For example, if set to 1, then path generation many randomly cease after encountering directly visible surfaces. (default: 5)