In this assignment, I implemented a simple ray tracer with triangle intersection capabilities and normal interpolation for smooth shading. The environment supports basic scene navigation using the WASD keys and includes multiple shading modes to visualize different aspects of our scene.
Below is an example of the Cornell box rendered with my raytracer.
In the second assignment, progressive rendering and ray jittering were added to improve image quality by reducing aliasing. Additionally, we implemented Uniform and BRDF direction sampling along with Probability Density Function (PDF) sampling. This setup and the progressive renderer allow us to achieve smooth rendering results in simple scenes with reasonable performance.
Below are images showcasing different sampling techniques:
In this assignment, I added support for mesh lights, which allows for soft shadows, light importance sampling, and MIS, which allows us to blend BRDF and importance sampling to obtain better results. The following images show how MIS allows us to converge towards a correct image much faster.
I added implicit and explicit path-tracing with Russian roulette termination in this assignment. As images are much nicer when using explicit path tracing, I have skipped results for implicit path tracing. Here are the results of explicit path tracing for increasing maximum bounces @ 100spp.