← All Projects

Physically Based Renderer

Development
Physically Based Renderer

I implemented this renderer as part of the computer graphics curriculum at Charles University, using the Nori educational ray tracing framework. My work included sampling routines, material models, and integrators, ending with a path tracer that uses multiple importance sampling.

Rendering

I implemented the integrators incrementally:

  • Ambient occlusion
  • Whitted-style ray tracing with recursive specular bounces and Russian roulette
  • Path tracing with BSDF sampling
  • Path tracing with next event estimation (explicit light sampling)
  • Path tracing with multiple importance sampling using the balance heuristic

The MIS integrator combines BSDF and light sampling, converting between solid-angle and surface-area measures.

Supported materials include Lambertian diffuse surfaces, perfect mirrors, dielectric glass with Fresnel reflection and refraction, and a Beckmann microfacet BRDF. Area lights are sampled by choosing triangles in proportion to their area, then sampling a point with uniform barycentric coordinates.

Sampling

I derived and implemented inverse CDF sampling for the tent, uniform disk, uniform sphere, uniform hemisphere, cosine-weighted hemisphere, and Beckmann distributions. I validated each with chi-squared tests.

Animation and motion blur

I wrote a Python pipeline to generate time-parameterized scenes and average temporal samples within a shutter interval. A custom xorshift32 PRNG decorrelates temporal noise from Nori’s built-in sampler.

The video above shows oscillating light spheres over microfacet plates, rendered with the MIS path tracer.

Source code

The repository is private on the faculty GitHub because the course policy prohibits sharing the source code.