Nori is a minimalistic ray tracer written in C++. It runs on Windows, Linux, and Mac OS and Nori 2 was built for the course Advanced Computer Graphics taught at EPFL. We are using a lightly modified version of Nori 2 as the framework for our assignments in CS 6630. (Historical note, Nori made its debut in CS 6630 exactly a decade ago.)

While Nori provides a lot to simplify your development work, the starter code achieves very little: it loads a scene and saves a rendered image as an OpenEXR image—but the actual rendering code is missing, so the output image is all black. Your task will be to extend this system to a full-fledged physically-based renderer as part of the programming assignments and your final project.

Core features

The Nori base code provides many features that would be tedious to implement from scratch. The following are included:
  • A simple GUI to watch images as they render
  • An XML-based scene file loader
  • Basic point/vector/normal/ray/bounding box classes
  • A pseudorandom number generator (PCG32)
  • Support for saving output as OpenEXR files
  • A loader for Wavefront OBJ files
  • Ray-triangle intersection
  • Code for multi-threaded rendering
  • Image reconstruction filters
  • Statistical \(\chi^2\)- and \(t\)-tests to verify sampling code
  • A graphical visualization tool that can be used to inspect and validate sampling code
  • An efficient ray intersection engine with a parallel bounding volume hierarchy builder (distributed separately from the base code)


You may find the following general references useful:

Feel free to consult additional references when completing projects, but remember cite them in your writeup.

Guidelines for homework submissions

The goal of these exercises is to help you create the foundation of a good renderer for subsequent assignments and the rendering competition. It is your job to convince me that you have implemented the assignments correctly, through the information provided in your reports and the quality/readability of your code. So incomprehensible code or inconclusive comparisons/validations in your report won't get you full credit even if your program works. Make sure to start working on the assignments early enough to leave plenty of time puzzle over things and to ask for help. Building your own advanced renderer is a lot of fun! But it doesn't always go smoothly.

What to submit?

Source code submission is handled via CMS. For each assignment you will write a small report that should adhere to the following conventions:

  • You'll hand in a GitHub URL that points to a specific commit in your COECIS GitHub repository, which has your source code, your report PDF file, and also supporting results from your program.
  • Structure your report using numbers and titles following those of the assignment.
  • Nori automatically generates both a .exr as well as a sRGB tonemapped .png image of your rendering that can be directly used for the comparisons in your report. Please still commit both versions in your results/ folder.
  • Include descriptions of encountered problems, a list of external libraries that you used (if applicable) and the time you spent on each task.
The task descriptions may contain more specific instructions on what to include.


I invite any comments or criticism to improve the projects in future classes. Please use the first section of your report to provide feedback—naturally, this part won't affect your grade. Examples of useful information include:

  • How much time did you spend on the assignment? How was it divided between designing, coding, and testing?
  • What advice should we have given you before you started?
  • What was hard or surprising about the assignment?
  • What did you like or dislike? What else would you change?

Late submissions

Late submissions are handled via slip days following a policy described in class.