mr-sanders
mr-sanders is a "production-style" Monte Carlo rendering engine written from scratch in C++20. Unlike research renderers, the priority is artist usability: fast interactive feedback, a broad feature set, and as few technical controls as possible. Heavy emphasis was also placed on developer tooling: profiling, logging, diagnostics, and testing tools for performance and correctness.
This is my biggest project to date. I've tried to combine everything I've learned about rendering and software engineering into a single robust, genuinely usable renderer.
It is named after my first cat. 🐱
The current roadmap is to finish full Blender compatibility, and then adding GPU/XPU support.
Notable Features
Interactive
- Render preview window with progressive refinement.
- Interactive camera (
-ipr): fly through the scene with WASD / mouse while it renders.
Geometry
- Triangle meshes, spheres, quads, disks.
- Curves / hair: B-spline strands (ribbon / thick / oriented).
- Embree 4 BVH acceleration: hardware-optimised ray traversal and multi-level instancing.
- Catmull-Clark subdivision with adaptive dicing (OpenSubdiv).
- Scalar displacement mapping, per-object ray visibility masks.
- 3D Gaussian splats.
- Heterogeneous volumes (fog, atmosphere, OpenVDB / NanoVDB) with the Henyey-Greenstein phase function.
- Emissive volumes with physically-based blackbody / thermal radiation.
- Volume motion blur from VDB velocity fields (Eulerian semi-Lagrangian advection).
Shading
- Full Open Shading Language (OSL) integration: JIT-compiled, thread-safe shader networks.
- OpenPBR surface shader (full spec).
- Physically-based hair BCSDF (Chiang et al. 2016).
- MaterialX support:
.mtlxnetworks compiled to OSL and mapped onto native lobes. - Procedural metallic-flakes shader and procedural textures (noise, image, checkerboard, normal map, displacement).
- Programmable shaders: scenes can reference
.oslon disk with no recompile. - Texture system with caching, mipmapping, and filtering (OIIO).
- Nested dielectric medium priority stack.
Lighting & sampling
- Point, distant, spot, area (quad / disk / sphere / mesh), skydome (lat-long HDR), and IES photometric lights.
- Light-tree importance sampling for many-light scenes.
- Sobol quasi-random sampling (OpenQMC).
- Next event estimation + MIS, Russian roulette.
- Delta tracking and ratio tracking for participating media.
- Adaptive sampling: per-pixel error-driven termination.
- Filter importance sampling with box, Gaussian, and windowed-sinc reconstruction filters.
- A "one-click" Caustics Solver (Conty & Kulla 2020): guided photon mapping with photon beams for difficult light paths.
Camera
- Perspective and orthographic, thin-lens depth of field, aperture blades.
- Linear camera and object motion blur.
- Ray differentials for texture filtering.
Colour & output
- OpenColorIO colour management: ACEScg render space, configurable display / view transforms.
- EXR, PNG, JPEG, TIFF, HDR and more (OIIO).
- AOVs: normal, albedo, depth, emission, background, direct / indirect lighting, raycount, cputime.
- Cryptomatte (v1.2) for per-object / material ID mattes.
- Intel Open Image Denoise using albedo / normal guide buffers.
Developer tooling
- GoogleTest suite, Tracy profiler instrumentation.
- Structured logging, CPU / memory diagnostics, per-render stat accumulators.
Renders
Coming soon...