We have provided a simple HTML skeleton in index.html found within the docs/ folder to help you get started and structure your write-up.

You are also welcome to create your own webpage report from scratch using your own preferred frameworks or tools. However, please follow the same overall structure as described in the Deliverables section below.

The goals of your write-up are for you to (1) think about and articulate what you have built and learned in your own words and (2) have a write-up of the project to take away from the class. Your write-up should include the following:

  • An overview of the project, including your approach to and implementation for each of the parts, as well as what problems you have encountered and how you solved them. Strive for clarity and succinctness.
  • For each part, make sure to include the results described in the corresponding Deliverables section, in addition to your explanation. If you failed to generate any results correctly, provide a brief explanation on why.
  • Clearly indicate any extra credit items you have completed; and provide a thorough explanation and illustration for each of them.
  • At the end, if you worked with a partner, please write a short paragraph together for your final report that describes how you collaborated, how it went, and what you learned.

The write-up is one of our main methods to evaluate your work, so it is important to spend the time to do it correctly and thoroughly. Plan ahead to allocate time for the write-up well before the deadline.

Technical details: Do not convert or resize your .png. files. Use either the windowless rendering mode or use the S key to save screenshots in GUI. Do not use the built-in screenshot utility of your OS. Keep your images in the docs/images/ subdirectory. We recommend using the -r 480 360 command line flag to set resolution at 480 by 360 for all your screenshots.

Deliverables

Part 1

  • Walk through the ray generation and primitive intersection parts of the rendering pipeline.
  • Explain the triangle intersection algorithm you implemented in your own words.
  • Show images with normal shading for a few small .dae files.

Part 2

  • Walk through your BVH construction algorithm. Explain the heuristic you chose for picking the splitting point.
  • Show images with normal shading for a few large .dae files that you can only render with BVH acceleration.
  • Compare rendering times on a few scenes with moderately complex geometries with and without BVH acceleration. Present your results in a one-paragraph analysis.

Part 3

  • Walk through both implementations of the direct lighting function.
  • Show some images rendered with both implementations of the direct lighting function.
  • Focus on one particular scene with at least one area light and compare the noise levels in soft shadows when rendering with 1, 4, 16, and 64 light rays (the -l flag) and with 1 sample per pixel (the -s flag) using light sampling, not uniform hemisphere sampling.
  • Compare the results between uniform hemisphere sampling and lighting sampling in a one-paragraph analysis.

Part 4

  • Walk through your implementation of the indirect lighting function.
  • Show some images rendered with global (direct and indirect) illumination. Use 1024 samples per pixel.
  • Pick one scene and compare rendered views first with only direct illumination, then only indirect illumination. Use 1024 samples per pixel. (You will have to edit PathTracer::at_least_one_bounce_radiance(...) in your code to generate these views.)
  • For CBbunny.dae, render the mth bounce of light with max_ray_depth set to 0, 1, 2, 3, 4, and 5 (the -m flag), and isAccumBounces=false. Explain in your writeup what you see for the 2nd and 3rd bounce of light, and how it contributes to the quality of the rendered image compared to rasterization. Use 1024 samples per pixel.
  • For CBbunny.dae, compare rendered views with max_ray_depth set to 0, 1, 2, 3, 4, and 5(the -m flag). Use 1024 samples per pixel.
  • For CBbunny.dae, output the Russian Roulette rendering with max_ray_depth set to 0, 1, 2, 3, 4, and 100(the -m flag). Use 1024 samples per pixel.
  • Pick one scene and compare rendered views with various sample-per-pixel rates, including at least 1, 2, 4, 8, 16, 64, and 1024. Use 4 light rays.
  • You will probably want to use the instructional machines for the above renders in order to not burn up your own computer for hours.

Part 5

  • Explain adaptive sampling. Walk through your implementation of the adaptive sampling.
  • Pick two scenes and render them with at least 2048 samples per pixel. Show a good sampling rate image with clearly visible differences in sampling rate over various regions and pixels. Include both your sample rate image, which shows your how your adaptive sampling changes depending on which part of the image you are rendering, and your noise-free rendered result. Use 1 sample per light and at least 5 for max ray depth.

Part 6 (Optional)

  • Place all of the relevant extra credit portions in Part 6 of your writeup. We will not be grading extra credit written in other sections.
  • Make sure you include everything mentioned for the writeup in the extra credit portions (screenshots, explanations).
  • In general, explain your approach/method in detail, implementation details that are relevant, and relevant screenshots demonstrating that your fix works. Timing tables with speedup numbers would be appreciated if there are optimizations involved.

Feedback (optional, but highly encouraged!)

Please share any feedback you have here! This form should only take a minute or two to fill out, are entirely anonymous, and will directly impact how we run and develop projects for the rest of this semester!