Sample render of "Bathroom" by nacimus
It's my experimental bidirectional path tracer that I developed while doing my master's thesis with the topic: "Multiple Importance Sampling Weights for Metropolised Bidirectional Rendering Algorithms". The base renderer is a very flexible Vertex Connection and Merging/Unified Path Sampling [Georgiev et al, 2012,Hachisuka et al, 2012] implementation.
This experimental renderer seeks to address an issue found in MCMC renderers, which is that the "Balance Heuristic", used to compute relatively efficient MIS weights that are essential to decrease the variance in the renders, cannot be used accurately, as the sampling probability density of a MCMC chain is unknown.
The implentation of the final algorithm (src/renderer/vcm2.cpp) is essentially a combination of prior work by Grittmann et al [2019] and Šik et al [2016]. We found that we could sometimes get significantly improved results, in particular in areas of rough caustics.
The results of the final algorithm (last three images on the right) show some mild improvements over previous methods.
The codebase also implements some crude path-guiding techniques, as one of the original goals of the work was to mix path-guiding and MCMC methods in a novel way.
Optionally, the renderer includes interactive tools (with a basic real time renderer in Vulkan), which were particularly useful for visual debugging of the path-guiding data structures.
Probably not... at least not yet. It's here as a reference implementation of the work done in my Master's Thesis, though I hope I can extend it to something that can actually be useful for other people.
- CMake OR scons
- Embree
- stblib
- tinyexr
If you would like to compile the interactive tools, then you'll also need
- glfw
- vulkan
- imgui
- vickyr (custom vulkan renderer - link will be added soon)
(Note: the compilation was tested on the latest versions of debian (clang and gcc) and windows (clang and msvc))
- Configure the (absolute) paths to the libraries in config.py
- run
scons debug=${A} target=${B}, where ${A} is 'debug' or 'release', and ${B} is 'min' or 'tools'
- Configure the (absolute) paths to the libraries in cmake/config.cmake
- run the cmake uild normaly
I would have called it "hikari", the japanese word for light, but unfortunately my code is not as "simple and clean" as I'd like it to be.


