A side project which aims to build an efficient photorealistic software renderer.
- Written in C++14
- Developed for Windows and Linux
- Optimized using SSE and AVX intrinsics (especially in performance-critical and low level math code)
- Parsing scene description from a JSON file
- Low discrepancy sampling (scrambled Halton sequence)
- Adaptive sampling (using more samples in noisy image areas)
- Spectral rendering using hero wavelength method (Note: disabled with a macro by default)
- Debug rendering mode (for visualizing depth, normal vectors, material parameters, etc.)
- Camera simulation:
- Depth of Field (circle or polygonal bokeh)
- Barrel distortion
- Motion blur
- Bounding Volume Hierarchy (BVH) used for scene and mesh traversal (two levels of BVH)
- Scene object types: Triangle meshes, Sphere, Box, Plane
- Full per-object motion blur (translational and rotational)
- Both single-ray and AVX-optimized stream packet traversal
- Supported light transport algorithms:
- Naive Path Tracing (sampling only BSDF)
- Path Tracing with multiple importance sampling (sampling both lights and material BSDF)
- Bidirectional Path Tracing (with MIS)
- Vertex Connection and Merging (Note: work in progress, not all lights and BSDFs are working properly)
- Light Tracing (for debugging)
- Supported light types: point, area (triangle or quad), spherical, directional, background
- Physically based BSDFs: diffuse, metal, dielectric, plastic
- Cook-Torrance BSDF for specular reflection with GGX normal distribution
- Transparency and refraction
- Normal mapping support
- 2D bitmap textures
- Supported pixel formats: 8-bit unsigned int, 32-bit float, 16-bit float, block-compressed BC1, BC4 and BC5
- Supported file formats: BMP, DDS, EXR (thanks to https://github.com/syoyo/tinyexr library)
- Better material model and multilayer materials (e.g. introduce Disney-like "principled" material)
- Procedural textures
- Volumetric rendering
- Optimize traversal and shading with SSE/AVX