Lumen is a Vulkan ray tracing framework that contains a variety of variance reduction techniques. Its aim is to accelerate some of the well-known rendering techniques in computer graphics literature with the help of the ray tracing hardware in modern GPUs. All the techniques Lumen implements run fully on the GPU.
- Unidirectional Path Tracer with Multiple Importance Sampling (Path)
- Bidirectional Path Tracer (BDPT)
- Stochastic Progressive Photon Mapping (SPPM)
- Vertex Connection and Merging (VCM)
- Primary Sample Space Metropolis Light Transport (PSSMLT)
- Combined VCM + MLT Integrator (VCMMLT)
- ReSTIR
- ReSTIR GI
- ReSTIR PT / GRIS
- DDGI (Real time)
- FFT Convolution Bloom
- Diffuse, mirror, glass, conductor, dielectric and Disney Principled BSDF
- Spot (point), polygonal and directional lights
- JSON-based scene system
- Modified Mitsuba parser
- A lightweight Vulkan abstraction layer from scratch
- EXR output (F10)
- On-the-fly RMSE computation
- SPIRV reflection
- Render graph support with experimental Vulkan features
- Automatic resource and synchronization management
- Binding inference based on shader reflection results
- Simple builder pattern
With the recently integrated render graph, Lumen uses some of the more experimental Vulkan features. These are namely,
- Templated push descriptors (may be problematic with AMD)
- Event-based syncronization (via syncronization2 API, available from Vulkan 1.3)
- Experimental feature, may not work depending on your driver (May need Vulkan beta drivers on Nvidia)
- Enabled via
use_events
flag in the Render Graph settings. (SeeRenderGraphSettings
inRenderGraphTypes.h
andRayTracer.cpp
)
Japanese Classroom (Courtesy of Benedikt Bitterli)
ReSTIR 1 sample per pixel (Video comparison)
ReSTIR GI 1 sample per pixel (Video comparison)
To build Lumen, start cloning the repository with
git clone --recursive https://github.com/yuphin/Lumen.git
- Vulkan SDK
- Turing+ or RDNA2 GPU
- CMake 3.4 or above (Credits to @Lachei for porting the project to CMake and testing it on Linux)
Some of the sample scenes can be found in the scenes/
directory.
Sample scene files with various integrators can be found in the scenes/cornell_box/
directory.
To load a scene file simply run:
Lumen.exe <scene_file>
The best way to get started is to take a look at the unidirectional path tracer implemented in src/Raytracer/Path.cpp and gradually explore the other integrators. From there, you can focus on the related shaders that are located in the src/shaders
folder.
- Physically Based Rendering: From Theory to Implementation
- Light Transport Simulation with Vertex Connection and Merging
- Spatiotemporal Reservoir Resampling for Real-time Ray Tracing with Dynamic Direct Lighting
- ReSTIR GI: Path Resampling for Real-Time Path Tracing
- Robust Monte Carlo Methods for Light Transport Simulation
- Robust Light Transport Simulation via Metropolised Bidirectional Estimators
- Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields