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
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.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
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
The defensive sampling application is implemented in a new integrator, see
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.
test contains a number of Python scripts to render comparison images with various approaches.
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.
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
optimal_mis_executable variable in the beginning.)