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.

Ukulele from my homepage, rendered with Dino.
Ukulele from my homepage, rendered with Dino.

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

Example Renders

"Spring" character from Blender Open Movie project Spring, rendered with Dino.
Left Image: Uncorrelated. Comparison between uncorrelated Cranley-Patterson rotations and blue noise dithering at 1 sample per pixel. Dithering makes the image appears more converged at low sample counts. Uncorrelated
Right Image: Blue Noise. Comparison between uncorrelated Cranley-Patterson rotations and blue noise dithering at 1 sample per pixel. Dithering makes the image appears more converged at low sample counts. Blue Noise
Comparison between uncorrelated Cranley-Patterson rotations and blue noise dithering at 1 sample per pixel. Dithering makes the image appears more converged at low sample counts.