Nori is a minimalistic ray tracer written in C++. It runs
on Windows, Linux, and Mac OS and provides a foundation for
the homework assignments in the course
Advanced Computer Graphics taught at EPFL.
While Nori provides much support code to simplify your development
work as much as possible, the code that you will initially receive
from us does very little: it loads a scene and saves a rendered image
as an OpenEXR image—but
the actual rendering code is missing, hence the output image just
consists of black pixels.
Your task will be to extend this system to a full-fledged physically-based
renderer as part of programming assignments and your final project.
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 parallel bounding volume hierarchy builder (provided in the third assignment)
You may find the following general references useful:
Permissible sources of information
Feel free to consult additional references
when completing projects, but remember cite them in your writeup.
When asked to implement feature \(X\), we request that
you don't go and read the source code of the
implementation of \(X\) in some other renderer, because
you will likely not learn much in the process. The PBRT
book is excluded from this
rule. If in doubt, get in touch with the course staff.
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 us that you have implemented the assignments correctly, through the information provided in your reports and the quality/readability of your code. We will deduct points for poorly written code or inconclusive comparisons/validations in your report. Make sure to start working on the homework as early as possible. Building your own advanced renderer is a lot of fun. Use this great opportunity, and don’t forget to have fun!
Note: Undeclared copying of code or images (either from other students or from external sources)
is strictly prohibited! Any violation of this rule will lead to expulsion from the class. If you're ever in doubt, just include a citation in your code or report indicating where some idea came from, whether it be a web site, another piece of software, or anything—this always maintains your honesty, whether the source was used in a good way or not. When you turn your assignment in, you are claiming that everything in it is your original idea unless you cite a source for it.
What to submit?
Source code submission is handled via GitHub Classrooms explained below. For each assignment you will write a small report that should adhere to the following conventions:
- Structure your report using numbers and titles following those of the assignment.
- For every task include all images you generated in a format that is viewable within a web browser. You can use HDRI Tools or Photoshop to tonemap you images and save them as JPEG or PNG images. We recommend tonemapping your images by just changing exposure and using sRGB (if available) or a with a gamma value of 2.2.
- 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 has to be included.
We would appreciate any comments or criticism to improve the
projects in future years. Please use the first section of your report
to provide feedback--naturally, this part will not be graded.
Examples of information that is useful to us includes:
- 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 are subject to the grading scheme as
discussed in the first lecture: submitting a homework late
(which is interpreted strictly, i.e. using the exact
submission time on Moodle) consumes a late day. You have a
budget of 3 "free" late days that can be used for any
assignment without penalties. After this budget is used up,
the grade of the late submission is affected as follows:
- 1 day late: max 75% of score
- 2 days late: max 50% of score
- 3 days late or more: 0%