Image Synthesis Techniques(CS 348B)
CS 348B, Spring 2021
Tue/Thu 2:30 - 3:50pm
Instructors: Pat Hanrahan, Matt Pharr
Course Description

High-quality rendering is ubiquitous today, with applications ranging from entertainment to product design and architecture. The goal of this course is to provide a deep understanding of the fundamental mathematical and physical principles that are the basis of modern physically based rendering while also introducing the design principles and engineering trade-offs involved in designing and implementing high-performance rendering systems.


You should have a working knowledge of computer graphics (at the level of CS 248 and CS 348A, though it's not necessary to have taken these courses specifically). In particular, you should fully understand the basic 3D display pipeline, viewing and modeling transformations, simple geometric modeling using polygons and quadrics, and hidden surface algorithms like the z-buffer algorithm. Solid knowledge of integral calculus and basic geometric algorithms is important. You should understand the principles behind object-oriented programming and be a very good C++ programmer. Previous exposure to signal processing and probability is helpful, but not absolutely necessary.


There is one required text for the course.

Matt Pharr, Wenzel Jakob, and Greg Humphreys
Physically Based Rendering: From Theory to Implementation
Third Edition, Morgan Kaufmann, 2016.
[ On Amazon ]

This book has an extensive web site with additional information. The book is also freely available online.

Additional readings will be assigned from research monographs, papers from journals and conference proceedings, and excerpts from conference tutorials.

Programming Assignments
You will be given four programming assignments. We will use a a ray tracing system called pbrt. This system is a combined C++ codebase and textbook written in a literate programming language. Each student is expected to work individually and implement your own solutions (See the collaboration policy for additional guidance).

Late assignments: To allow for unforeseeable circumstances, you will be allowed five weekdays of grace during the quarter (to clarify: an assignment due on Friday and turned in on Monday will use one late day). Beyond this, late assignments will be penalized by 10% per weekday that they are late. On the last programming project, neither the demo nor the writeup may be late. Incompletes in this course are given only in exceptional circumstances.

Final Project and Rendering Competition

Final project: During the last two weeks of the course, you will propose and work on a self-selected final project. The final project may be done with one or two partners; teams may discuss their project with other teams, but may not share code. Each team will present the project orally during the Rendering Competition and produce a detailed write-up describing their work and results.

For the final project, you will render a new image by extending the system so that it is capable of reproducing an image of a real object that it can't currently render accurately (for example: a gemstone, a puff of smoke, a candle flame, etc). Check out the results produced by previous students.

In case the delight of learning does not sufficiently motivate you to exert yourself heroically on your final project, there will also be a rendering competition. During finals week, a judging will be held to select the most impressive final projects. The rendering competition jury, to be named later, will consist of computer graphics experts from both industry and academia. There will be prizes for the best projects.

The class grade will be based on the following: 10% participation and commenting on slides, 10% for each of the four programming assignments, and 50% for the final project.
Hardware and Software

You are welcome and encouraged to do class assignments on your own machines. Although pbrt builds successfully on most systems, the TAs will be able to provide support for compiling pbrt on Linux (on the public Stanford 'myth' machines, see below), on Mac OSX, and on Windows (via Visual Studio 2017, or 2019). Check out how to build pbrt for more information.

If you do not wish to develop on a personal machine, you will have access to the 'myth' machines located in Gates B08. They can be accessed via ssh at

All students with Leland accounts automatically have accounts on these machines. Home directories on these machines are shared with other Stanford Computing Clusters using AFS. If you do not have a Leland account, consult this ITSS web page.

Collaboration Policy

Students in CS 348B are absolutely encouraged to talk to each other, to the TAs, to the instructors, or to anyone else about course assignments. Any assistance, though, must be limited to discussion of the problems and sketching general approaches to a solution. Each programming project team must write their own code and produce their own writeup.

Consulting another student's or team's solution is prohibited and submitted solutions may not be copied from any source. These and any other form of collaboration on assignments constitute cheating. If you have any question about whether some activity would constitute cheating, be cautious and ask the instructors before proceeding!

You may not supply code, assignment writeups, or exams you complete during CS 348B to other students in future instances of this course or make these items available (e.g., on the web) for use in future instances of this course (just as you may not use work completed by students who've taken the course previously). Your github repository for the class must be made private.