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.

Teaching Staff



Matt Pharr (matt at pharr dot org)
Office Hours: By appointment, ideally before or after class meets.



Daniel Ritchie (dritchie at stanford dot edu)
Office Hours: MW 10am-12pm, Gates 3B open area

Course staff email address


You should have a working knowledge of computer graphics (at the level of cs248 and cs348a, 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 be a good C++ programmer and have general familiarity with the basic concepts of computer architecture and design. Any previous exposure to parallel programming, signal processing, probability, and optics is helpful but not necessary.


There is one required text for the course.

Matt Pharr and Greg Humphreys
Physically Based Rendering: From Theory to Implementation.
Second Edition, Morgan Kaufmann, 2010.
[ On Amazon ] The book has an extensive web site with additional information.

Additional readings will be assigned from research monographs, papers from journals and conference proceedings, and excerpts from conference tutorials. Readings for each lecture are available from the Reading page.

Discussion Boards

We will be using Piazza for discussions: cs348b Spring 2014 Piazza page.

Assignments and Projects

Programming assignments: students will complete four programming assignments. For these programming projects, you may discuss the assignment with friends, but you are expected to implement your own solutions.

All but one of the assignment involve enhancing a working ray tracer. 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.

Late assignments: to allow for unforeseeable circumstances, you will be allowed three 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: over the last two weeks of the course students will propose and complete 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.


  • Programming Assignments (4): 11% each = 44%
  • Final Project: 46%
  • Participation (on-line comments + explanation articles): 10%

The Rendering Competition

In the last part of the course you will extend the rendering system so that it is capable of reproducing an image of a real object that it can't currently render well, for example, a gemstone, a puff of smoke, a candle flame, etc. Check out the results produced by previous students. Alternatively, you may investigate methods for rendering existing scenes more efficiently: investigate the performance characteristics of some part of pbrt (computation requirements, memory usage, …) and optimize the system to improve its efficiency in this respect.

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 several awards and one grand prize-an all-expenses-paid trip to SIGGRAPH 2014 in Vancouver, Canada. Total value: about $1,000.

The rendering competition will be held during the final exam time for the course. In the event that you can't be there due to a conflict with another exam, you have two options:

  1. Work with a partner, and have your partner present your project at the competition. We'd prefer if all involved parties could be there, but this is acceptable if (and only if) there's a conflict with another exam.
  2. Don't participate in the competition. This means you'll miss out on a chance to win prizes (plus Eternal Fame and Glory), but it will have no bearing on your final grade in the class.

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 2008, 2010, or 2012). Check out the build instructions for more information about building pbrt.

If you do not wish to develop on a personal machine, you will have access to the 'myth' machines located in Gates B08 (3.16 GHz DELL Dual-Xeon Linux boxes). The myth machines are named myth1 - myth16. cs348b students are given non-exclusive priority access to these machines.

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. Registered students will get an extra 500MB of disk quota for the quarter (Please contact the course staff if your quota does not increase within 48 hours of signing up for the class).

Collaboration Policy

Students in cs348b 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, just be cautious and ask the instructors before proceeding!

You may not supply code, assignment writeups, or exams you complete during cs348b 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). Make sure to make repositories private if you use public source control hosts like github.