# nori is a teaching ray tracer built around one graphics course

> Nori is a simple ray tracer in C++ whose stated purpose is to provide the basic functionality required to complete the assignments of the Advanced Computer Graphics course taught at EPFL. That origin explains both its strengths, a small readable core you can take apart, and its limits, since it is a course framework rather than a production renderer and its licence is unstated.

**wjakob/nori** — Nori: an educational ray tracer

- Repository: https://github.com/wjakob/nori
- Website: https://wjakob.github.io/nori
- Stars: 918 · Forks: 189
- Language: C++
- License: not declared
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/wjakob-nori

## A renderer whose scope is a semester of assignments

The README is short, and its first substantive sentence defines the project precisely.
Nori is a simple ray tracer written in C++. It runs on Windows, Linux and Mac OS and provides basic functionality that is required to complete the assignments in the course Advanced Computer Graphics taught at EPFL.
That last clause is the important one. Nori is not a general purpose renderer competing with production path tracers. It is a teaching framework, and the word basic in the README is doing real work. The scope is what a course needs: enough of a renderer that students can extend it with new materials, sampling strategies and effects, and not so much that they spend the assignment reading code they did not write.
The audience is therefore two groups. The first is the students of the course, for whom Nori is the assignment substrate. The second is anyone who wants to understand how a ray tracer is put together by reading a codebase small enough to finish, which is a genuinely different thing from reading a large renderer.
The homepage at wjakob.github.io/nori is where the Nori 2 framework and the coding assignments are described, and the course itself lives at rgl.epfl.ch/courses/ACG17, where the slides and reading material are kept.
One instruction in the repository deserves emphasis before anything else. There is a file at the root named SHARING_SOLUTIONS_ONLINE_IS_FORBIDDEN.txt. The intent is clear from its name, and it is the reason this article describes the project rather than the answers.

## Nori 2, and the archive kept for the previous year

The current tree is Nori Version 2, and there is a build status badge for it.
The README contains a section addressed to researchers and students from other institutions, which says that last year's version of Nori, including a full set of assignment descriptions, can be found in a separate archive repository at github.com/wjakob/nori-old.
That is worth pausing on, because it tells you how the project is versioned in practice. The framework changes between academic years, and the old version is not deleted but parked in its own repository where it remains readable and, presumably, runnable.
For someone outside the course, the archive is arguably the more useful of the two, because it comes with a complete set of assignment descriptions. The current repository is the one that matches the present course, and the assignments themselves are described on the Nori website rather than in the README.
There are no GitHub releases for this repository. The versioning here is the academic year rather than a semantic version line, so if you are pinning a specific state, pin a commit and note which course year it belonged to.

## The layout shows how a teaching renderer is organised

The top level entries are few, and each one tells you something.
There is a CMakeLists.txt at the root, which is how the project is built, plus include/ and src/ for the code, scenes/ for scene descriptions, and ext/ for external dependencies. There is a .gitmodules file, which means ext/ holds submodules rather than vendored copies.
That split is the shape of a course framework. The src/ and include/ directories are the parts students modify and that carry the assignments. The scenes/ directory holds the sample content used to demonstrate and to test the renderer, and it is also the input for the course material. The ext/ directory keeps third party code out of the way so that the code a student reads is the code they are being taught.
Comparing this with a research renderer is instructive. A production renderer of this kind would normally bring in its own image and window handling, its own scene description format and its own build system, and it would be layered so that the educational parts are not mixed with the parts that exist only to make the demo look good. Nori's small tree is the consequence of being scoped to one course at one university.

## The GUI freezes on Intel integrated GPUs, and there is a one line fix

The known issues section is the most practically useful part of the README, because it names a failure that is easy to misdiagnose.
There is a known issue with the NanoGUI version that Nori uses: on Linux systems with an integrated Intel GPU, a bug in the Mesa graphics drivers causes the GUI to freeze on startup.
Three separate facts are stacked in that sentence. The freeze happens at startup, so it looks like the renderer is broken rather than the windowing layer. It only happens with an integrated Intel GPU, so a developer on a discrete card will never see it and will report that the project does not work. And the cause is in the Mesa driver version, not in Nori itself.
The workaround is to temporarily switch to an older Mesa driver, done by running a single export.
```sh
export MESA_LOADER_DRIVER_OVERRIDE=i965
```
The i965 driver is the older Intel GL driver, so this pins the loader to it for the session rather than upgrading or downgrading Mesa system wide. That is the right shape of workaround for a course machine, since it changes nothing permanent.
For anyone running Nori outside the course, the practical takeaway is broader than the bug: the GUI is the fragile part of this project, not the tracer. If you are on Linux with Intel integrated graphics, set that variable before you conclude anything about the code.

## Licence is unstated, and there are no packaged releases

Two facts about the packaging are worth recording before you adopt this repository.
The first is the licence. The licence field for this repository is listed as unknown, and there is no LICENSE file among the top level entries. There is a .gitignore, a .gitmodules, a CMakeLists.txt, a README.md, the SHARING_SOLUTIONS_ONLINE_IS_FORBIDDEN.txt file, and the source directories, but no licence text.
That is unusual, and it matters in one specific way. If you plan to read Nori to learn from it, the absence of a licence does not stop you. If you plan to copy code from it into a project of your own, you have no grant to rely on, and the course's own restrictions on sharing solutions apply to the assignments as well. For a project with a stated educational purpose and an explicit rule about sharing solutions online, treat the code as something to study rather than as a source to vendor.
The second is the distribution model. The repository has no GitHub releases, so there is no packaged binary to download and no versioned artefact. You clone it, you build it with CMake, and you get whatever the current master contains.
On activity, the repository is not archived and the last push was on 2026-04-23. That is consistent with a course framework that is refreshed between academic years rather than patched continuously.

## Conclusion

Adopt nori if you are a student on the EPFL Advanced Computer Graphics course, or a self taught reader who wants a small ray tracer to read end to end. Do not adopt it as a rendering engine for production work, and do not reuse its assignment solutions, because the repository states that sharing solutions online is forbidden. Before you build it, read the SHARING_SOLUTIONS_ONLINE_IS_FORBIDDEN.txt file at the root, and if you are on Linux with an integrated Intel GPU, apply the MESA_LOADER_DRIVER_OVERRIDE=i965 workaround before the GUI starts freezing.

## FAQ

### What is the Nori ray tracer?

Nori is a simple ray tracer written in C++ that runs on Windows, Linux and Mac OS. The README states that it provides basic functionality required to complete the assignments in the Advanced Computer Graphics course taught at EPFL.

### Where can I find the Nori assignments and course material?

The Nori 2 framework and coding assignments are described on the Nori website at wjakob.github.io/nori, and the course slides and reading material are on the Advanced Computer Graphics website at rgl.epfl.ch/courses/ACG17.

### The Nori GUI freezes at startup on my Linux machine, what should I do?

The README describes a known issue where a bug in the Mesa graphics drivers causes the GUI to freeze on startup on Linux systems with an integrated Intel GPU. The workaround is to temporarily switch to an older Mesa driver by running export MESA_LOADER_DRIVER_OVERRIDE=i965.

### Where is the previous version of Nori with the assignment descriptions?

The README says last year's version of Nori, including a full set of assignment descriptions, can be found in the archive repository at github.com/wjakob/nori-old.

### Can I use Nori code in my own project?

The repository has no stated licence and includes a file named SHARING_SOLUTIONS_ONLINE_IS_FORBIDDEN.txt at its root. The code is meant for the course assignments, so treat it as material to study rather than as a source to copy into another project.

## Sources

- [Issues](https://github.com/wjakob/nori/issues)
- [Project website](https://wjakob.github.io/nori)
- [README](https://github.com/wjakob/nori/blob/master/README.md)
- [wjakob/nori on GitHub](https://github.com/wjakob/nori)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/wjakob-nori
