Skip to content
Implementation of the paper "Variance-Aware Multiple Importance Sampling" for bidirectional path tracing in PBRT.
C++ Objective-C Python C CMake Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Variance-aware MIS weights in PBRTv3

This repository implements the approach discussed in the "Variance-Aware Multiple Importance Sampling" paper.

The core of the implementation is in src/util/samis.h and src/util/samis.cpp: The class SAMISRectifier implements the rectification as a black box: given the outcome of paths sampled from the first iteration, it computes the required variance estimates and the resulting factors.

For reference value computations, the files src/util/varestim.h and src/util/varestim.cpp provide a utility class to compute accurate estimates of the variance factors given a large number of samples.

The implementation required minor changes in the bidirectional path tracer integrator (src/integrators/bdpt.cpp and bdpt.h) to separate the rendering into multiple iterations and to look-up and multiply with the propper variance factors during the MIS computation. Furthermore, the weighted combination of the first iteration with the following one also required a small addition to the Film class in src/core/film.cpp and src/core/film.h. The defensive sampling application is implemented in a new integrator, see src/integrators/guideddi.cpp and src/integrators/guideddi.h. The implementation is analogous to the one from the "Optimal Multiple Importance Sampling" paper by Kondapaneni et al.

For build instructions, documentation, test scenes, etc., refer to the original PBRTv3 repository or the repository created by Benedikt Bitterli. All results in the paper were generated from (sometimes slightly modified versions of) the scenes from those repositories.


The folder test contains a number of Python scripts to render comparison images with various approaches.

The test/ script loads a number of PBRT scene files (specified in the script) and replaces the integrator and sampler definitions by the appropriate methods, as given in the beginning of the script.

The test/ script does the same for the defensive sampling application. For the comparison to the optimal MIS weights, the path to the source code from that paper needs to be hard-coded in the script (by modifying the optimal_mis_executable variable in the beginning.)

You can’t perform that action at this time.