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/runtests_bdpt.py
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/runtests_di.py
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.)