Course Description

OpenGL and WebGL, real-time rendering, 3D display systems, display optics & electronics, IMUs and sensors, tracking, haptics, rendering pipeline, multimodal human perception and depth perception, stereo rendering, presence. Emphasis on VR technology. Hands-on programming assignments. The 3-unit version requires a final programming assignment in which you create your own virtual environment. The 4-unit version requires a final course project and written report in lieu of the final assignment. (Course Catalog Entry)

EE267W Writing in the Major (WIM) version of EE267. This 5-unit WIM version of EE267 is the same as the 4-unit version of EE267 but additionally requires participation in 2 writing in the major workshops, and weekly writing assignments. EE267W is only available for undergraduate students who are enrolled in the 4-unit version of EE267. Please contact the course staff to enroll.

Topics include:

  • Introduction to computer graphics
  • The graphics pipeline
  • OpenGL, WebGL, and GLSL shader programming
  • JavaScript with Three.js
  • Stereoscopic perception and rendering
  • Head mounted display optics and electronics
  • Inertial measurement units: gyros, accelerators, magnetometers
  • Sensor fusion: complementary filter, Kalman filter
  • Human perception: visual, audio, vestibular, tactile, ...
  • Guest lectures from VR experts (e.g. Oculus Research)
  • ... more interesting topics.

Course Goals

This is a technical class. Students will learn about all hardware (optics, electronics, display, microcontroller, ...) and software (JavaScript, WebGL, GLSL) aspects of Virtual Reality (VR). The goal for this class is to learn all of these aspects in a hands-on manner. Each assignment is a small piece of a bigger project. The goal for each student or small team of students is to build a fully functional head mounted display, including optics, display, IMU, rendering, lens distortion shader, model loader etc., from off-the-shelf parts. The HMD we will build is inspired by the Oculus DK1. We will NOT learn game development, but study the fundamental building blocks of VR systems and implement all of them.

Class Time and Location

Mondays and Wednesdays from 3:00pm to 4:20pm at Building 200-034.


Released as video recording every Friday, with an optional in-person session in Packard 001.

To use the room Packard 001, students have to review and understand this material. After reviewing it, they need to send an email to Steven Clark (steveclark(at)ee(dot)standord(dot)edu) with their SUNet ID number (the one near their name on the ID card) and a note for indicating that they understood the material. Once approved, they will have access to the room. If they would like to have lab64 access for their course projects, they may include that in the note and their access will be granted.

Office Hours

Discussion about projects Questions about homework, labs and lectures @Packard 001


Email ( us ONLY when your problems cannot be resolved via Piazza.


Your assignment reports will be submitted through Gradescope. Use the code M6P2J6 to join the class. If you work as a team, make sure to indicate your team member in the submission

Textbooks, Course Notes, and other Reading Materials

Students are required to read additional resources as indicated for each lecture or week. These readings will help get a better intuition and deeper insights into the topics of this course. The readings may also be required to complete tasks for assignments.

Detailed course notes are available for the topics covered in weeks 5 and 6: orientation tracking with inertial measurement units (IMUs) and pose tracking with the VRduino. You can download these notes here:

Other topics of in this class are adequately covered by existing textbooks, even though these are optional for the course. The material covered in the lectures should be self-contained, but it's always a good idea to read up on more details. In particular, parts of the following two textbooks will be useful for EE 267:

Both of these textbooks are freely available online or through the Stanford library, just click on the titles above. We will only be reading a few chapters of these books, so there's no need to purchase them.

The hands-on parts of this course, i.e. labs and assignments, are based on JavaScript, WebGL, and GLSL. It's really important for students to go through tutorials on their own, such as these


Assignment Details

There will be weekly assignments in this class. These assignments will mainly involve implementation of techniques that we will discuss in class. Please refer to assignment writeups for details. After you finish, submit your code and report on Gradescope.

Grading Policy

The course requirements include: (1) 6 assignments, (2) an in-class midterm, and (3) either a major final project with report (4 unit version) or a long 7th homework (3 unit version). The 5-unit WIM option additionally requires weekly writing assignments and participation in 2 workshops.


This is an experimental class. Enrollment is limited to 80 students working in teams of 2. All hardware will be provided in the lab but must be returned at the end of the course. Unfortunately, our hardware resources and the lab space are currently limited. If you did not get a chance to enroll, come to the first few classes anyway and sign up for the waiting list. Last time, everyone on the waiting list got in so don't panic!

Writing in the Major (WIM)

The 5-unit WIM version of this course (EE267W) is an option for EE undergraduates who need to satisfy their WIM requirement. If you would like to sign up for this, you have to also be enrolled in the 4-unit version of EE267 and contact the course instructors during the first week of classes. In addition to all the requirements of the 4-unit version, the WIM option has weekly writing and reading assignments. You can find an outline of these additional assignments here.

Class Format

Each week, there are 2 lectures and 1 lab. The lab is a hands-on lecture where we go over the hardware and software environments and start working on the weekly assignment or aspects relevant for that. Students will complete the assignment after the lab. We will release the lab as a video every Friday but the TAs will also be available for an in-person lab to help if you need it.

Getting Help

If you have a question, to get a response from the teaching staff quickly we strongly encourage you to post it to the class Piazza. For private matters, please make a private note visible only to the course instructors. For longer discussions with TAs and to get help in person, we strongly encourage you to come to office hours. You can also reach out to us via email at (a mailing list consisting of the TAs and instructors).

Collaboration Policy

Students are supposed to work on the theoretical part of assignments independently. However, students are allowed to form teams of up to 2 people to work on the programming part of assignments. Even when students work as a team, each student must understand the solution well enough in order to reconstruct it by him/herself.

Late policy

Since starter code of new assignments typically include answers of previous assignments, there are NO late days for assignments.

Related Courses

This course requires programming experience (especially JavaScript, C or C++) as well as basic knowledge of linear algebra. We will review most of the required mathematical concepts, but we assume that you have strong programming skills. Homework require JavaScript and GLSL programming. Even though we don't assume prior experience in JavaScript and GLSL, you should be able to understand object-oriented programs and modify them. Previous knowledge of computer graphics or computer vision would be helpful but is not absolutely required.

Courses that may be very helpful, but are not prerequisites:

Related courses at Stanford that you may also find interesting:

A few of the course topics overlap with different parts of related courses.


This course is generously supported by AMD and Oculus VR. Thanks for making this happen!

This webpage is designed by Chi Zhang based on the website for CS231N. We thank Andrej Karparthy, who designed the CS231N website and kindly shared the code with us. The course banner is re-designed based on this image used in a Udacity's post.