The Last Time

The Last Time

A physically-based photorealistic global illumination renderer

Overview

This Offline Renderer is a physically-based photorealistic 3D renderer I am writing from scratch in C++. Rainbow is built from the ground up as a global illumination renderer supporting global illumination through light transport algorithms, including volumetric unidirectional pathtracing with multiple importance sampling. The renderer is still a work in progress.

Features

  • Advanced Global illumination
    • Volumetric unidirectional path tracing
    • Volumetric probabilistic progressive photon mapping(Point estimation and Beam estimation)
    • Primary sample space metroplis light transport (Kelemen-style MLT)(WIP)
    • Path Guider (WIP)
  • Geometry
    • Triangle and quad meshes
  • Lights
    • Point light
    • Spot light
    • Directional light
    • Area light
  • Materials and BSDFs
    • Thin-film iridescence
    • Rough conductor and dielectric using microfacet models (GGX)
    • Smooth conductor and dielectric
    • Transparent BSDF
    • Blend BSDF
    • Support alpha texture
  • Media
    • Homogeneous medium
    • Heterogeneous medium (OpenVDB file)
  • Acceleration Structure System
    • SAH-BVH acceleration
    • Embree3
  • Render Mode
    • Adaptive mode
    • Progressive mode
    • Final mode

Select Images



Iridescence effect, using the method from Belcour and Barla 2017, $\eta_1 = 1.0, \eta_2 = 1.33, \eta_3 = 1.0, k_3 = 0, d = 300-850nm$

Goniochromism when changing view position, $\eta_1 = 1.0, \eta_2 = 1.33, \eta_3 = 1.0, k_3 = 0, d = 550nm, \alpha = 0.1$

Crepuscular beam

Homogeneous medium with HG phase function (density = 10, albedo = 1, g = 0), multi-scatter

Disney cloud, 1050spp + OIDN denoised

Smoke (VDB file from OpenVDB)

Smoke (VDB file from JangaFX)

Initial radius = 0.005, alpha = 0.9, # of delta photon = 1M, iteration = 0.5K

Initial radius = 0.2, $\alpha$ = 0.5, iteration = 5000


The first image is from path tracing, 1024K spp, 11h59m46s
The second image is from SPPM, initial radius = 0.08, $\alpha$ = 0.5, # of delta photon = 1M, iteration = 1K, 8m48s

Initial radius = 0.05, $\alpha$ = 0.3, iteration = 1000, # of delta photon = 100k

Blend BSDF of smooth dielectric and matte, Au conductor BSDF (convert SPD to RGB)

Alpha texture for leaf

Rough conductor, alpha_u = 0.1, alpha_v = 0.1

Rough conductor, alpha_u = 0.005, alpha_v = 0.1

Rough dielectric, alpha_u = 0.1, alpha_v = 0.1

Rough dielectric, alpha_u = 0.005, alpha_v = 0.1

The images below are from my old renderer Rainbow.

Veach thesis multiple importance sampling test scene. Rendered using pathtracing with multiple importance sampling.

Homogeneous medium(volumetric caustic WIP) 

Heterogeneous medium

Rendered using volumetric unidirectional pathtracing.

Resources

Physically Based Rendering: The go-to reference book for rendering, by Matt Pharr, Wenzel Jakob, and Greg Humphreys.
Monte Carlo Methods for Physically Based Volume Rendering: A good note for nearly all researches about volume render.