Dino
Dino is a physically-based renderer written from scratch. It's purpose is to act as a testbed for my own rendering experiments and to help me gain a deeper understanding of how rendering really works under the hood. Although historically an interactive GPU renderer, the current iteration of Dino runs entirely on CPU.
Dino is in active development! Check my blog for updates and discussion about the techniques I'm using.
Features
Complex Scenes
Dino reads scenes from .dino files which use a custom JSON scene format. Scenes are traversed using Embree. Both triangle meshes and hair curves can be loaded from Wavefront .obj files and support instancing and file caching. Images and textures are loaded using OpenImageIO. Multicore rendering scales linearly and has been tested up to 24 cores.
Material Plugins
Dino supports materials using a Mitsuba-like eval/sample/pdf interface. BSDFs can contain both smooth and Dirac delta components, and support an arbitrary number of RGBA textures. Built-in materials include smooth and microfacet metals, smooth and microfacet Fresnel dielectrics (glass), diffuse transmission, Disney's Principled BSDF, and Disney's Hair BSDF.
Other Plugins
In addition to material plugins, Dino supports both light plugins and integrator plugins. Built-in lights include point, directional, sphere, quad, spot, and importance-sampled environment mapping. Currently, only forward path tracing and ambient occlusion integrators are implemented, but I plan to implement more complex light transport algorithms (bidirectional, VCM, path guiding) as well as an integrator for sorted deferred shading.
Robust Sampling
On top of standard integrator sampling features such as multiple importance-sampled direct lighting, Dino pre-generates and caches strong sampling patterns for use during rendering. Progressive multi-jittered (pmj) 2D samples with unique per-pixel Cranley-Patterson rotations are used for sampling of the pixel filter, lens, BSDF, and lights. Filter importance sampling is used for pixel filters. For renders with low sample counts, blue noise dithering can be enabled for improved perceptual quality.
Volume Rendering
Dino supports homogeneous volumes which can include both Beer-Lambert attenuation and Monte Carlo subsurface scattering. Priority-based handling of overlapping volumes is supported via nested dielectrics. Dino also has a separate volume renderer which can handle heterogeneous media via delta tracking.
Other Features
- Russian roulette
- normal mapping
- transparent backgrounds
- depth of field (thin lens)
- OpenGL-based progress viewer
- Mitsuba scene converter