MNRT_Sponza_Small.png Project Description

The application MNRT implements several techniques to realize fast global illumination for dynamic scenes on Graphics Processing Units (GPUs). It was developed during the creation of my Diplomarbeit (German master thesis equivalent):

Neumann, Mathias
"GPU-basierte globale Beleuchtung mit CUDA in Echtzeit"
Diplomarbeit, FernUniversität in Hagen, 2010

Currently neither an English nor a German version of my thesis are available online. Please check the documentation of MNRT for some background on MNRT. It's available in English.

Right now MNRT is very experimental. Furthermore MNRT does not show all features of the system described in my thesis. For example, spherical harmonics are not used to handle glossy materials, yet. I released MNRT (including source code) to the public as I believe that I might not be able to fully concentrate on improving the application in the next time. Hence I want to allow others to check what I've done so far. Maybe someone has some ideas on improving MNRT. I'd be glad to hear about them.


MNRT is not a fully functional application for end users. This section shows features and problems of the current version of MNRT.

  • Almost everything (except e.g. scene and image loading) is implemented on the GPU using CUDA.
  • GPU-based kd-tree implementation. Currently both triangle and point kd-trees are supported.
  • GPU-based ray tracing implementation, including kd-tree traversal algorithm for intersection search.
  • GPU-based photon Mapping including final gathering to compute indirect illumination. This includes algorithms for photon tracing and density estimation.
  • Iterative, histogram-based kNN-search implementation.
  • Accelerated final gathering step by adaptively selecting samples and subsequent interpolation (for indirect illumination).
  • Accelerated density estimation using an illumination cut through the kd-tree of the photon map. Gathering k nearest photons is replaced by a spatial interpolation using RBF.
  • CUDA implementations of parallel reduction and parallel segmented reduction.
  • CUDA API overhead elimination using custom GPU memory pool which allocates big chunks of memory and hands segments of memory out to requesters.
  • Random number generation using NVIDIA's Mersenne Twister SDK sample.

  • MNRT does not yet perform at frame rates required for computer games.
  • Currently only diffuse materials (BRDFs) are allowed. I already added some support for specular BSDFs (reflection, transmission), but it is currently disabled.
  • Missing support for spherical harmonics. Using irradiance values instead of radiance fields. Furthermore there is no support to read glossy materials from scene descriptions, yet.
  • Input scenes may only consist of triangles.
  • Dynamic geometry, lights and materials are not implemented. Camera position however can be varied. The former would require an animation system. To simulate dynamic geometry, there is an option to rebuild kd-trees for objects and photon maps every frame.
  • MNRT does not benefit from multiple GPUs, yet.
  • Right now, the CPU cores are left unemployed and all work is done on the GPU. Moving some work to CPU cores might be a possible way to increase performance.

Source Code Quality
  • As MNRT is my first GPU-based application, it might not be the state-of-the-art of GPU-based programming.
  • In no case does MNRT represent a high quality software product of good stability and extensibility.
  • Seeming limitations of the CUDA API reduced the coherency of some components, e.g. limited scope of CUDA texture references.
  • Due to limited optimization, one might reach significant improvement for some parts of MNRT.
  • Doxygen was used to create a source code documentation.

Last edited Dec 5, 2010 at 3:55 PM by maneumann, version 11