Rodent: Generating Renderers without Writing a Generator

Monte-Carlo Renderers must generate many color samples to produce a noise-free image, and for each of those, they must evaluate complex mathematical models representing the appearance of the objects in the scene. These models are usually in the form of shaders: Small programs that are executed during rendering in order to compute a value for the current sample.

Renderers often compile and optimize shaders just before rendering, taking advantage of the knowledge of the scene. In principle, the entire renderer could benefit from a-priori code generation. For instance, scheduling can take advantage of the knowledge of the scene in order to maximize hardware usage. However, writing such a configurable renderer eventually means writing a compiler that translates a scene description into machine code.

In this paper, we present a framework that allows generating entire renderers for CPUs and GPUs without having to write a dedicated compiler: First, we provide a rendering library in a functional/imperative language that elegantly abstracts the individual rendering concepts using higher-order functions. Second, we use partial evaluation to combine and specialize the individual components of a renderer according to a particular scene.

Our results show that the renderers we generate outperform equivalent high-performance implementations written with state-of-the-art ray tracing libraries on the CPU and GPU.

BibTeX
@article{perard2019rodent,
  author          = {Pérard-Gayot, Arsène and Membarth, Richard and Leißa, Roland and Hack, Sebastian and Slusallek, Philipp},
  title           = {Rodent: Generating Renderers without Writing a Generator},
  journal         = {ACM Transactions on Graphics (TOG) (Proceedings of SIGGRAPH 2019)},
  pages           = {40:1--40:12},
  volume          = {38},
  number          = {4},
  year            = 2019,
  month           = jul,
  date            = {2019-07-28/2019-08-01},
  doi             = {10.1145/3306346.3322955},
  publisher       = {ACM}
}