Illumination techniques based on ray tracing have been historically regarded as off-line only techniques. The improvements of hardware and visibility query algorithms in the last decade have accelerated many of these techniques to interactive frames.
The most powerful processor in today's high-end personal computers is the GPU. Combined with its graphics capabilities, the GPU becomes a natural target for interactive, ray-tracing based, illumination algorithms. However, harnessing the full power of the GPU is not trivial. The programming model of the GPU is limited and full of potential performance pitfalls. Most algorithms need to be redesigned in order to exploit the GPU's power and ray tracing is not an exception. Our framework (GPURT) attempts to alleviate the work required in writing a ray tracing based illumination algorithm.
GPURT is a library for writing ray tracing based illumination algorithms, running on the GPU. In contrast to other existing GPU ray tracing libraries, GPURT attempts to provide the programmer with a set of building blocks, rather than with a programmable ray tracing pipe-line. It gives the programmer almost full freedom to create, modify and combine such blocks.
With the exception of the CUDA kernels, GPURT is written entirely in C#. It consists of several modules:
- ManagedCUDA is an object oriented interface to the CUDA driver API. It supports almost all features of CUDA, including OpenGL and Direct3D interoperability. It also provides a wrapper for CUDA's nvcc, thus enabling just-in-time compilation of CUDA kernels.
- RTCore works over ManagedCUDA to provide a mechanism for writing and combining building blocks. It also provides several default building blocks, such as traversal/construction of BVHs and data compaction.
- IlluminationAlgorithms is a library that builds on top of RTCore and provides building blocks for several popular illumination algorithms: Whitted style ray-tracing, instant radiosity, and path tracing (currently broken).
- SceneGraph is a scene graph library built on top of RTCore. It provides building blocks for defining geometry, materials, instances, and light sources. It also provides an OBJ loader, a VRML based scene graph (with support for animations), and an implementation of a speed-up graph that bridges the VRML scene graph with the object representation of the ray tracer.
- DX10RayTracer is the front end application, which combines the blocks of the SceneGraph and IlluminationAlgorithms libraries with a WPF based GUI
Below are screenshots from GPURT on several scenes with different Illumination algorithms. The resolution and FPS can be seen on the lower right angle of each screenshot. All images were produced on an Intel quad-core machine with a single GTX280 in it.