Library / SDK
mitsuba-renderer/mitsuba3 avatar
mitsuba-renderer/mitsuba3

Mitsuba 3: a retargetable renderer you drive from Python

Mitsuba 3: A Retargetable Forward and Inverse Renderer

2,933 stars365 forksC++NOASSERTION

At a glance

What is it?
Mitsuba 3 is EPFL's research renderer for forward and inverse light transport. It ships as a pip package with thirteen variants, so the same scene can run as scalar RGB or differentiable spectral on a GPU.
Who is it for?
Adopt Mitsuba 3 if you need differentiable light transport, spectral or polarized output, and you are comfortable working in Python rather than a DCC application. Do not adopt it as a Blender replacement or as a production asset pipeline renderer; the README describes it as research-oriented, there is no documented rollback path for a variant mismatch, and the extra variants require compiling Dr.Jit with CMake.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem Mitsuba 3 solves, and who it is for

A conventional renderer answers one question: what does this scene look like from this camera? Mitsuba 3 answers that, and then answers the inverse question as well. Because it is differentiable, it can compute derivatives of an entire simulation with respect to camera pose, geometry, BSDFs, textures and volumes. That turns rendering into an optimization problem: instead of guessing at a material parameter, you compute the gradient and let an optimizer recover it from a reference image.

The project is developed at EPFL and describes itself as a research-oriented rendering system for forward and inverse light transport simulation. That framing matters for adoption. The README does not present it as a competitor to production pipeline renderers; it presents a core library plus a set of plugins covering materials, light sources and complete rendering algorithms, with Python as the primary interface. If your work involves publishing a differentiable rendering method, reproducing one, or building a spectral simulation with polarization, this is the target audience. If you need to render a product shot by Friday, the tooling around it will feel like the wrong shape.

Retargetability: one scene, thirteen variants

The word retargetable is the design center. The README states that the underlying implementations and data structures can transform to accomplish different tasks, so the same code can simulate scalar RGB transport or differential spectral transport on the GPU. In practice you pick a variant string at runtime, and the plugins behind that string are compiled for that configuration.

The pip package bundles thirteen variants. Four are scalar: scalar_rgb, scalar_spectral, scalar_spectral_polarized, and the one-ray-at-a-time family that trades speed for simplicity. Eight are vectorized and differentiable: llvm_ad_rgb, llvm_ad_mono, llvm_ad_mono_polarized, llvm_ad_spectral, llvm_ad_spectral_polarized, and the matching four cuda_ad_* variants. The split is explicit in the README: scalar variants do one ray at a time, while LLVM and CUDA variants are for inverse rendering on CPU or GPU respectively.

This is a real architectural commitment, not a flag. The README notes that accessing additional variants requires compiling a custom version of Dr.Jit with CMake. Dr.Jit is the JIT compiler built for this project; it fuses rendering code into kernels through an LLVM backend on CPU and a CUDA/OptiX backend on NVIDIA hardware. So the variant list is a menu, and the menu is fixed by whoever built your wheel.

Installing Mitsuba 3 and rendering the Cornell box

The README gives one install command. Pre-compiled binary wheels are published on PyPI, and the Python package includes all thirteen variants by default. Requirements listed are Python 3.10 or newer, optionally Nvidia driver 535 or newer for GPU computation, and optionally LLVM 18 or newer for vectorized CPU computation.

bash
pip install mitsuba

After that, the README's Hello World example is the shortest path to a real image. It imports the library under the alias mi, sets a variant, loads a scene from a Python dictionary, renders it, and writes an EXR file.

python
import mitsuba as mi
mi.set_variant('scalar_rgb')
scene = mi.load_dict(mi.cornell_box())
img = mi.render(scene)
mi.Bitmap(img).write('cbox.exr')

What you should see is a file named cbox.exr in your working directory containing the rendered Cornell box. The order matters: mi.set_variant must run before you touch any other part of the API, because the variant determines which plugin implementations get loaded. The project also installs a mitsuba command line entry point, declared in pyproject.toml as mitsuba = "mitsuba.__main__:main".

For a first inverse-rendering experiment, change the variant line to 'llvm_ad_rgb' or a cuda_ad_* variant and use the same scene; the README states those variants are the ones intended for inverse rendering. The documentation site hosts Jupyter notebooks, how-to guides and reference material, and the project has recorded YouTube tutorials that the README describes as a gentle introduction to Mitsuba 3 and Dr.Jit.

Where Mitsuba 3 is the wrong tool

The variant system is also the sharpest limitation. A wheel carries thirteen variants; anything else needs a custom Dr.Jit build via CMake, and the README points to the developer guide for that. If your research needs a configuration outside the bundled list, you are now maintaining a compiler toolchain, not just a Python dependency.

The dependency graph is tighter than a typical pip package. The project metadata pins drjit==1.6.0.dev1, a development release rather than a stable version, and the build system requires nanobind==3.1.0 exactly. A pinned pre-release dependency means your environment is coupled to whatever else in the project depends on Dr.Jit, and there is no documented rollback path if a variant or dependency mismatch appears after an upgrade. The README does not describe a fallback or a compatibility mode.

GPU use is bounded by hardware. The CUDA and OptiX path targets NVIDIA GPUs with ray tracing hardware acceleration, and the stated minimum is driver 535. AMD and Apple GPUs are not covered by that backend. macOS is listed as tested on aarch64 and x86_64, but the accelerated path there is LLVM on the CPU.

Finally, the project is research-oriented by its own description. That is not a criticism of the code; it is a statement about what the surrounding tooling optimizes for. Scene interchange, asset management and the kind of iteration loop a lighting artist expects are not what the README advertises.

Mitsuba 3 versus PBRT-style CPU renderers

The natural comparison is with a physically based CPU renderer in the PBRT lineage. Both simulate light transport and both are used in graphics research, but they answer different questions.

A PBRT-style renderer is built around forward simulation: given a scene description, produce an image. Its scene format is the interface, and the renderer is the program. Mitsuba 3 inverts that relationship. The README describes it as Python first, with materials, textures and even full rendering algorithms developable in Python and JIT-compiled on the fly. The renderer becomes a library you call from a script, and the script is the program.

That difference shows up in what each is good at. If you want to implement a new integrator and compare it against a reference, the PBRT approach of editing the renderer is direct. If you want to fit a material to a photograph, or differentiate through a volume, the Mitsuba 3 approach of writing a Python loop around mi.render is the one that works, because the derivative is available as part of the same call. The retargetability claim is what makes that possible: the same scene description drives a scalar RGB simulation and a differential spectral one, without rewriting the scene.

Licence, releases and upgrade cost

The repository's LICENSE file exists at the top level, and pyproject.toml carries the classifier "License :: OSI Approved :: BSD License". The GitHub metadata reports the licence as NOASSERTION, meaning the automated classifier could not map the file to a standard identifier. That discrepancy is worth resolving by reading LICENSE directly before you depend on the terms; this is a description of what the files say, not legal advice.

Release cadence is visible from the tags. v3.9.0 was published on 2026-08-07, v3.8.0 on 2026-02-23, and v3.7.1 on 2025-09-17. The last push to the default branch was on 2026-09-23. The citation block in the README refers to version 3.9.1, so the citation and the release list do not line up exactly.

Upgrade cost is dominated by the pinned Dr.Jit dependency rather than by API churn. Because drjit==1.6.0.dev1 is pinned and the build requires a specific nanobind version, moving between Mitsuba releases can move your Dr.Jit version with it. The practical check before upgrading is whether the variants you use are still in the bundled list, and whether the Nvidia driver and LLVM versions your machine has still meet the stated minimums.

Editorial conclusion

Adopt Mitsuba 3 if you need differentiable light transport, spectral or polarized output, and you are comfortable working in Python rather than a DCC application. Do not adopt it as a Blender replacement or as a production asset pipeline renderer; the README describes it as research-oriented, there is no documented rollback path for a variant mismatch, and the extra variants require compiling Dr.Jit with CMake. Before committing, verify on your own machine that pip install mitsuba resolves the pinned drjit==1.6.0.dev1 dependency, that your Nvidia driver is at least 535 if you plan to use the cuda_ad_* variants, and that the variant you set with mi.set_variant is the one your scene actually needs.

Frequently asked questions

How do I install Mitsuba 3?

The README gives a single command: pip install mitsuba. Pre-compiled binary wheels are published on PyPI and the Python package includes thirteen variants by default. Python 3.10 or newer is required.

What is Mitsuba 3?

It is a research-oriented rendering system for forward and inverse light transport simulation, developed at EPFL. It consists of a core library plus plugins for materials, light sources and full rendering algorithms, and it is retargetable, meaning the same code can run as scalar RGB or as differential spectral transport on the GPU.

Which Mitsuba 3 variant should I set for inverse rendering?

The README states that the scalar variants perform one-ray-at-a-time simulations, while the LLVM and CUDA variants are used for inverse rendering on the CPU or GPU respectively. So the llvm_ad_* and cuda_ad_* families are the ones intended for that work.

Does Mitsuba 3 need a GPU?

No. The CUDA and OptiX backend targeting NVIDIA GPUs is optional, and the README lists Nvidia driver 535 or newer only as an optional requirement for GPU computation. The LLVM backend runs vectorized computation on the CPU, and the scalar variants need neither.

Can I add a Mitsuba 3 variant that is not in the pip package?

The README says that to access additional variants you need to compile a custom version of Dr.Jit using CMake, and points to the compiling section of the documentation. The thirteen bundled variants are what the wheel ships with.

Official sources

  1. Issues
  2. mitsuba-renderer/mitsuba3 on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/mitsuba-renderer-mitsuba3.svg)](https://hysenlabs.com/projects/mitsuba-renderer-mitsuba3)