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>
{
'type': 'transient_path',
'max_depth': 8
}
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>
{
'type': 'transient_path',
'max_depth': 8
}
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.
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>
{
"type": "transient_nlos_path",
"nlos_laser_sampling": True,
"nlos_hidden_geometry_sampling": True,
"nlos_hidden_geometry_sampling_includes_relay_wall": False,
"temporal_filter": "box",
}
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>
{
"type": "transient_nlos_path",
"nlos_laser_sampling": True,
"nlos_hidden_geometry_sampling": True,
"nlos_hidden_geometry_sampling_includes_relay_wall": True,
"temporal_filter": "box",
}
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 |
|
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 |
|
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) |