Skip to content

Releases: mitsuba-renderer/mitsuba3

v3.8.0

23 Feb 14:55

Choose a tag to compare

  • Upgrade Dr.Jit to version 1.3.1. This release brings several important improvements and bug fixes, here are some noteworthy changes:

    • Atomic scatter operations: New dr.scatter_cas() (atomic compare-and-swap) and dr.scatter_exch() (atomic exchange) operations mapping to native PTX instructions on the CUDA backend.
    • AdamW optimizer: New dr.opt.AdamW optimizer with built-in weight decay, and AMSGrad support for both Adam and AdamW.
    • Oklab color space conversion: New dr.linear_srgb_to_oklab() and dr.oklab_to_linear_srgb() for perceptually uniform color space conversion.

    The remainder lists Mitsuba-specific additions.

  • Improvements:

    • New conditional 1D distributions (ConditionalRegular1D and ConditionalIrregular1D) for efficient conditional probability computations, including lazy CDF computation and a traversable interface. (PR #1725, contributed by Miguel Crespo).
    • The pplastic (polarized plastic) BSDF now supports spatially varying roughness and index of refraction through texture parameters. (PR #1843, contributed by Guillermo Enguita Lahoz).
    • Significant sunsky emitter optimizations: more efficient internal memory reads and a faster importance sampling strategy. (PRs #1768, #1800, contributed by Matteo Santini).
    • Improved function freezing support across many Mitsuba components: ellipsoids/ellipsoidsmesh shapes, batch sensor, hdrfilm, and 1D/2D distribution classes. (PRs #1791, #1816, contributed).
    • Ellipsoids bounding box computation can now be done on the JIT backend, significantly speeding up scene setup. (PR #1838, contributed by Sebastien Speierer).
    • Added a JIT-enabled version of Mesh::build_directed_edges(). (PR #1760).
    • Parser optimization: avoid re-checking visited nodes for cycles during scene loading. (PR #1842, contributed by Vincent Leroy).
    • ShapeGroup now caches parameters_grad_enabled() to avoid repeated checks. (commit 925f36ecb, contributed by Vincent Leroy).
    • Added wheels for Python 3.14 and Linux ARM (aarch64). (PR #1807, contributed by Merlin Nimier-David).
    • Updated minimum Python version to 3.9. (PR #1814, contributed by Delio Vicini).
    • Include child properties in Mesh::to_string() output. (PR #1811, contributed by OscarLin).
  • Bug fixes:

    This list is not exhaustive:

    • Fixed multiple issues in the blendbsdf plugin: incorrect PDF in sample(), missing eval_null_transmission method, and incorrect sampling weight in both blendbsdf and blendphase. (PR #1681, contributed by Baptiste Nicolet).
    • Fixed Embree memory leak in scalar modes where acceleration data structures were not properly cleaned up. (PR #1767, contributed by Delio Vicini).
    • Fixed ray_intersect_triangle in Python returning None instead of the result from the C++ call. (PR #1780, contributed by Jeremy Riviere).
    • Fixed numerical issues in AD (PRB) integrators. (PR #1818, contributed by Christian Doring).
    • Fixed bitmap textures evaluating to 0 in CUDA double-precision variants, and similarly for sdfgrid. (commits e18c1657, 54cc70eb).
    • Fixed hide_emitters to handle custom shapes. (commit 3f968c544).
    • Restored resources feature in load_dict(). (PR #1829).
    • Fixed mesh not respecting explicitly provided normals (normals would be recomputed unconditionally). (PR #1762, contributed by Delio Vicini).
    • Added missing si.compute_uv_partials(ray) for AOV type duv_dy. (PR #1772, contributed by Sebastian Winberg).
    • Fixed handling of 3x3 transforms in Properties. (PR #1764).
    • Handle differentiation through aov when no AOVs carry gradients. (commit f235aa22).
    • Fixed KDTree builds on MSVC. (commit 9e542b68).
    • Fixed shapegroup.h compilation when no vectorized backend is available. (commit 85ae5712).
    • Handle numpy scalars in Properties. (PR #1788).
    • Fixed __repr__ for Python-created meshes. (PR #1753, contributed by Delio Vicini).
    • Fixed build compatibility with newer CMake versions. (commit eb65b90).

v3.7.1

17 Sep 20:43

Choose a tag to compare

  • Upgrade Dr.Jit to version 1.2.0. This release brings several important improvements and several bug fixes:

    • Event API for fine-grained GPU kernel timing and synchronization, enabling better performance profiling.
    • Enhanced CUDA-OpenGL interoperability with simplified APIs for efficient data sharing between CUDA and OpenGL.
    • Register spilling to shared memory on CUDA backend, improving performance for complex kernels with high register pressure.
    • Memory view support for zero-copy data access from Python.

    The remainder lists Mitsuba-specific additions.

  • Improvements:

    • Improved bump and normal mapping with two important fixes for more robust and artifact-free rendering. Both the bumpmap and normalmap BSDFs now include: (1) Invalid normal flipping - ensures perturbed normals are always consistent with the geometric normal by flipping shading normals when needed, following the approach in Schüssler et al. 2017. (2) Microfacet-based shadowing - smooths shadow terminator artifacts using the shadowing function from Estevez et al. 2019. Both features are enabled by default but can be disabled via the flip_invalid_normals and use_shadowing_function parameters for backwards compatibility. (commit e32d71807, contributed by Delio Vicini).
    • Improved sunsky documentation. (PR #1743, contributed by Mattéo Santini).
    • Added support for vcalls of Texture. (commit 6b1603c77).
    • Added Python bindings for field<T> types. (PR #1736, contributed by Delio Vicini).
    • Allow multiple Python objects to refer to the same Object*. (PR #1740).
  • Bug fixes:

    • Fixed bug with unintentional reordering of channels when serializing and deserializing a Bitmap with more than 10 channels. (commit e84b18f, contributed by Sebastian Winberg).
    • Fixed hide_emitters behavior for area emitters in path integrator and all other integrators. (commits 3c3bf14c, 0755134e0, c967a0a24).
    • Fixed KDTree reference counting and shutdown procedure. (commit 14c8c9763).
    • Fixed compilation issues of the KDTree. (commit 65b38126b).
    • Prevent NaN values for normals of triangles with zero area. (PR #1733, contributed by Delio Vicini).
    • Prevent users updating the UniformSpectrum with a float of size different than 1. (PR #1722, contributed by Mattéo Santini).
    • Added Image manipulation tutorial back in the "How-to Guides". (commit 465609174, contributed by Baptiste Nicolet).
    • Add support for JIT-freeting to the sunsky classes. (commit f07f26c5e).

v3.7.0

07 Aug 10:43

Choose a tag to compare

  • Upgrade Dr.Jit to version 1.1.0. The following list summarizes major new features added to Dr.Jit. See the Dr.Jit release notes for additional detail and various smaller features that are not listed here.

    • Cooperative vectors and a neural network library: Dr.Jit now supports efficient matrix-vector arithmetic that compiles to tensor core machine instructions on NVIDIA GPUs. A modular neural network library facilitates evaluating and optimizing fully fused MLPs in rendering code. (Dr.Jit PR #384, Dr.Jit-Core PR #141).

    • Hash grid encoding: Neural network hash grid encoding inspired by Instant NGP, including both traditional hash grids and permutohedral encodings for high-dimensional inputs. (Dr.Jit PR #390, contributed by Christian Döring and Merlin Nimier-David).

    • Function freezing: The @drjit.freeze decorator eliminates repeated tracing overhead by caching and replaying JIT-compiled kernels, which can dramatically accelerate programs with repeated computations. (Dr.Jit PR #336, Dr.Jit-Core PR #107, contributed by Christian Döring).

    • Shader Execution Reordering (SER): drjit.reorder_threads shuffles threads to reduce warp-level divergence, improving performance for branching code. (Dr.Jit PR #395, Dr.Jit-Core PR #145).

    • New random number generation API: The function drjit.rng returns a drjit.random.Generator object (resembling analogous API in NumPy, PyTorch, etc.) that computes high-quality random variates that are statistically independent within and across parallel streams. (Dr.Jit PR #417).

    • Array resampling and convolution: New functions drjit.resample and drjit.convolve support differentiable signal processing with various reconstruction filters. (Dr.Jit PRs #358, #378).

    • Gradient-based optimizers: New drjit.opt module with drjit.opt.SGD, drjit.opt.Adam, and drjit.opt.RMSProp optimizers. They improve upon the previous Mitsuba versions and include support for adaptive mixed-precision training. (Dr.Jit PRs #345, #402).

    • TensorFlow interoperability: @drjit.wrap enables seamless integration with TensorFlow. (Dr.Jit PR #301, contributed by Jakob Hoydis).

    • Enhanced tensor operations: New functions drjit.concat, drjit.take, drjit.take_interp, and drjit.moveaxis for tensor manipulation.

    • Performance improvements: Packet scatter-add operations, optimized texture access, and faster drjit.rsqrt on the LLVM backend (Dr.Jit PRs #343, #329, #406, Dr.Jit-Core PR #151), The remainder lists Mitsuba-specific additions.

  • Function freezing. Using the previously mentioned @dr.freeze feature, it is now possible to freeze functions that call mi.render(). Rendering another view (e.g., from a different viewpoint or with a different material parameter) then merely launches the previously compiled kernels instead of tracing the rendering process again. This unlocks significant acceleration when repeatedly rendering complex scenes from Python (e.g., in optimization loops or real-time applications). Some related changes in Mitsuba were required to make this possible. (PRs #1477, #1602, #1642, contributed by Christian Döring).

  • AD integrators and moving geometry. All automatic differentiation integrators have been updated to correctly handle continuous derivative terms arising from moving geometry. In particular, the continuous (i.e., non-boundary) derivative of various integrators was missing partial derivative terms that could be required in certain geometry optimization applications. The updated integrators also run ~30% faster thanks to Shader Execution Reordering (SER). (PR #1680). We thank Markus Worchel, Ugo Pavo Finnendahl, and Marc Alexa for bringing this issue to our attention.

  • Gaussian splatting. Two new shape plugins support volumetric rendering applications based on 3D Gaussian splatting: ellipsoids is an anisotropic ellipsoid primitives using closed-form ray intersection, while ellipsoidsmesh uses a mesh-based representation. The volprim_rf_basic integrator renders emissive volumes based on them (PR #1464, contributed by Sebastien Speierer).

  • The new sunsky plugin implements Hosek-Wilkie models for the sun and sky, where sampling of the latter is based on Nick Vitsas and Konstantinos Vardis' Truncated Gaussian Mixture Model. (PR #1473, #1461, #1491, contributed by Mattéo Santini).

  • Shader Execution Reordering (SER). The Scene.ray_intersect() and Scene.ray_intersect_preliminary() methods now accept a reorder parameter to trigger thread reordering on CUDA backends, which shuffles threads into coherent warps based on shape IDs. Performance improvements vary by scene complexity (ranging from 0.67x to 1.95x speedup). SER can be controlled globally via the scene's allow_thread_reordering parameter or by disabling drjit.JitFlag.ShaderExecutionReordering. Most integrators have been updated to use SER by default. (PR #1623).

  • The performance of ray tracing kernels run through the CUDA/OptiX backend was significantly improved. Previously, several design decisions kept Mitsuba off the OptiX "fast path", which is now fixed. (PRs #1561, #1563, #1568).

  • Mitsuba now targets the OptiX 8.0 ABI available on NVIDIA driver version 535 or newer. (PR #1480).

  • Bitmap textures now use half precision by default. (PR #1478.)

  • Improvements to the mitsuba.Shape interface. (PRs #1484, #1485).

  • The Mitsuba optimizers (e.g. Adam) were removed. They are now aliases to more sophisticated implementations in Dr.Jit. (Mitsuba PR #1569, Dr.Jit PR #345).

  • The Transform API became more relaxed—for example, Transform4f.scale() and Transform4f().scale() are now both equivalent ways of creating a transformation. This removes an API break introduced in Mitsuba version 3.6.0. (PR #1638).

  • Refactoring. The codebase underwent several major refactoring passes to remove technical debt:

    1. Removal of the legacy thread system and replacement with standard C++ constructs (PR #1622).

    2. Removal of the legacy object system and replacement with standard C++ constructs; rewrite of the mi.Properties and plugin loader implementations (PR #1630).

    3. Switched to a new parser and scene IR common to both XML and dictionary parsing; further work on mi.Properties (PRs #1669, #1676)

    4. Replaced Transform4f by specialized affine and perspective transformations. (PR #1679).

    5. Pass over the test suite to accelerate CI test runs (PR [#1659](https://github.com/mitsuba-ren...

Read more

v3.6.4

04 Feb 14:49

Choose a tag to compare

Changes in this patch release:

  • Upgrade Dr.Jit to v1.0.5
  • Fix normalmap (1a4bea2)
  • Fallback mechanism for numerical issues in silhouette sampling (ce4af8d)

v3.6.2

16 Jan 13:58

Choose a tag to compare

Changes in this patch release:

  • Enable parallel scene loading by default in mitsuba CLI (regression) 338898d
  • Improved bitmap construction in scalar variants 6af4d37

v3.6.1

16 Jan 07:25

Choose a tag to compare

Changes in this patch release:

  • Improve robustness of parallel scene loading 8d48f58
  • Fixes to mi.sample_tea_floatfd16fbe
  • Support for complex numbers or quaternions in mi.ad.Adam optimize eff5bf6
  • Improved error message when mi.load_dict fails 7db5401
  • Add missing implementations for spot emitter (for AD) 9336491

v3.6.0

25 Nov 12:44

Choose a tag to compare

This release comes with a major overhaul of some of the internal components of Mitsuba 3. Namely, the Python bindings are now created using nanobind and the just-in-time compiler Dr.Jit was updated to version 1.0.0.

These upgrades lead to the following:

  • Performance boost: 1.2x to 2x speedups depending on the JIT backend and scene size
  • Improved stubs: auto-completion and type-checking has been greatly improved
  • More variants on PyPI: thirteen variants are available in the pre-built wheels

Some breaking changes were made in this process. Please refer to the porting guide to get a comprehensive overview of these changes.

This release also includes a series of bug fixes, quality of life improvements and new features. Here's a non-exhaustive list:

  • Support for Embree's robust intersection flag 96e0af2
  • Callback system for variant changes #1367
  • MeshPtr for vectorized Mesh method calls `#1319
  • Aliases for the ArrayX types of Dr.Jit 2e86e5e
  • Fix attribute evaluation for twosided BSDFs 5508ee6 .. 7528d9f
  • A new guide for using Mitsuba 3 in WSL 2
  • batch sensors expose their inner Sensor objects when traversed with mi.traverse() #1297
  • Python stubs improvements #1260 #1238
  • Updated wheel build process with new variants #1355

v3.5.2

10 Jun 13:28

Choose a tag to compare

Most likely the last release which uses pybind11.

Changes in this patch release:

  • Avoid segfaults during OptiX scene shutdown 03f5e13

v3.5.1

05 Jun 09:48

Choose a tag to compare

Changes in this patch release:

  • Upgrade Dr.Jit to v0.4.6
  • More robust scene clean-up when using Embree 7bb672c
  • Support for AOV fields in Python AD integrators f3b427e
  • Fix potential segfault during OptiX scene clean-up 0bcfc72
  • Improve and fix Mesh PMF computations ced7b22 .. 7d2951a
  • Shape.parameters_grad_enabled now only applies to parameters that introduce visibility discontinuities 3013adb
  • The measuredpolarized plugin is now supported in vectorized variants 68b3a5f
  • Fix an issue where the constant plugin would not reuse kernels deebe4c
  • Minor changes to support Nvidia v555 drivers 19bf5a4
  • Many numerical and performance improvements to the sdfgrid shape 455de40 .. 9e156bd

v3.5.0

11 Dec 19:28

Choose a tag to compare

Changes in this version:

  • New projective sampling based integrators, see PR #997 for more details.
    Here's a brief overview of some of the major or breaking changes:

    • New prb_projective and direct_projective integrators
    • New curve/shadow optimization tutorial
    • Removed reparameterizations
    • Can no longer differentiate instance, sdfgrid and Sensor's positions