Due Date

Tuesday April 2nd, 11:59pm


You will add additional features to your ray tracer from Project 3-1, including more complicated materials, environment lights, and depth of field effects. This project is of comparable size to 3-1, so plan accordingly and leave time for renders/writeup.

Project Parts

You'll also want to read these articles:

Getting Started

Accept the assignment through the link posted on piazza, and clone from your private repo using the command:


As before, use cmake and make inside a build/ directory to create the executable (how to build and submit).

Please consult the project 3-1 spec for details on the user interface. Here are some old and new command line flags you'll want to pay attention to:

  • -e some_map.exr loads an environment light .exr image file (part 3)
  • -b 1.23 sets the lens radius to 1.23 (part 4)
  • -d 4.56 sets the focal distance to 4.56 (part 4)

As well as two new keyboard commands:

  • k | l: Increase/Decrease the camera lens radius
  • ; | ': Increase/Decrease the focal distance

Also please use the "cell render" mode to debug, where you can interactively click and drag to select a small region of the screen to be rendered. Press c (after pressing r) to toggle this mode in the GUI.

Integrating Previous Code

For Project 3-2, you will need a working implentation of Project 3-1. You have the option of either porting your code from Project 3-1, or using pre-compiled binaries generated from the staff solution.

Using Your Own 3-1 Code

To use your own code, set the build option BUILD_3-1 to ON in CMakeLists.txt. Then, you'll need to copy over the following files from your previous assignment, and place them in your src/ directory.

  • Part 1: triangle.cpp, sphere.cpp (place in src/static_scene directory)
  • Part 2: bvh.cpp, bbox.cpp

Additionally, you will have to copy specific functions from their old files in the previous assigment into part1_code.cpp:

  • From pathtracer.cpp
    • PathTracer::estimate_direct_lighting_hemisphere
    • PathTracer::estimate_direct_lighting_importance
    • PathTracer::zero_bounce_radiance
    • PathTracer::one_bounce_radiance
    • PathTracer::at_least_one_bounce_radiance
    • PathTracer::est_radiance_global_illumination
    • PathTracer::raytrace_pixel
  • From bsdf.cpp
    • DiffuseBSDF::sample_f
    • DiffuseBSDF::f
  • From camera.cpp
    • Camera::generate_ray

Using the Staff Library

To use the provided library, set the build option BUILD_3-1 to OFF in CMakeLists.txt. This will tell the generated makefiles to ignore part1_code.cpp, triangle.cpp, sphere.cpp, bvh.cpp, and bbox.cpp, and include the library that matches your system instead. Note that the staff binary will generate a small watermark on the corner of your image.

Final Note

When you finish Project 3-2, you can basically render anything, so show it off! Make some fancy scenes and materials, and play with the lens! Again, be creative!