Pathtacer
This pathtracer was a final project for the course Fundamentals of Computer Graphics, but it has very quickly turned into my go-to project for practing computer graphics & rendering concepts.
Features
The pathtracing algorithm is a brute force solution to solving the Rendering Equation presented by Kajiya in the aptly titled paper The rendering equation. It has capable of simulating soft shadows, ambient occlusion, color bleeding, and reflections & refractions. My current version only supports surface reflections, but refractions are currently in progress.
Scene Graph
Geometric instancing is a key feature to reduce memory usage by storing a single copy of each mesh in the scene, then dynamically applying a model matrix to obtain the world coordinates for each vertex. Doing avoids the need to bake geometry, and still allows one to scale, rotate, and translate many copies of the same mesh with no noticable performance degradation.

Glossy and Advanced Microfacted BRDFS
For surface materials, I have chosen to implement physically based Bidirectional Reflection Distribution Functions (BRDFS). Currently, there is support for the Cook Torrence and Disney Principled BRDFs. For the microfacet Distribution function, I have chosen the GGX distribution.
Sampling
The main limitation with Monte-Carlo pathtracing is the noisy output images. To reduce noise, we can importance sample BRDFs to decrease the number of samples needed to generate high-quality images. This also reduces the run time quite a bit.

Uniform Hemisphere Sampling of the GGX distribution with 128 samples per pixel

Importance Sampling the GGX distribution with 128 samples per pixel
Blender Support
To create scene files, I have also created a Blender plugin to export projects to my custom XML file format.


Code
The source code for this project can be found on my Github repository here.
Credits
Scenes were created using models from the McGuire Computer Graphics Research Archive.