GPU Path Tracer

This project performs global illumination rendering using path tracing on the GPU using OptiX. The renderer integrates some of my work in motion blur¬†alongside a few additional features. Path tracing is typically used for global illumination on the GPU because of its simplicity. Since stream processing architectures typically sacrifice storage bandwidth in favor of arithmetic bandwidth, the simpler approach of path tracing (since you don’t have to perform a lookup into a photon map or something) leverages the benefits of such an architecture. Similar approaches are used in professional-quality GPU renderers like iray and Octane, but obviously with some more intelligent sampling strategies.

Here’s a partial feature list for this renderer:

  • Full global illumination using path tracing
  • Customizable materials (texture support, normal maps, reflections, refractions, emission, etc.)
  • Full motion blur support with grouping, instancing, customizable time reconstruction kernel, and arbitrary rotation axes
  • Thin-lens camera model for customizable depth of field (focal length and aperture)
  • Multi-dimensional quasi-Monte Carlo sampling (using Hammersley sequence)
  • Support for physically-based sunlight/sky

Russian roulette sampling is used in the shading code for determining which branch (e.g., reflection, diffuse, refraction) should be followed with the probability of following that branch based on its weight (similar to PBRT). Russian roulette is also used for killing off paths that are not worth exploring due to very low accumulation.

There’s still plenty of room for optimization and expansion within this project. I’m currently exploring a number of options from bidirectional path tracing to frameless sampling, in addition to more creative uses of the renderer like browsing Minecraft worlds.