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 course project with a 1-2 page report. The 4-unit version requires a final course project with a 6-8 page conference paper style report. (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 enroll in EE267 and then contact the course staff during the first week of the quarter 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 Lecture Format

Lectures are Mondays and Wednesdays 9:45-11:15 am in McCullough 115.

These lectures are not recorded, because there is no AV equipment in the room. However, based on popular request, we will release the video recordings of zoom lectures 2-14 from last year on canvas the same day as the corresponding lecture is taught in person. Note that there may be minor differences between last year's recordings and this year's in-person lectures, so plan on attending in person if you can.

If you have questions related to the lecture material, use Ed Discussion or the live zoom office hours of the instructor and the TAs to ask them. Guest lectures towards the end of this quarter will be live-streamed via zoom and then available as video recordings.


Released as video recording together with a set of written instructions every Friday here. Use Ed Discussion or the live zoom TA office hours to ask questions.

Office Hours

Discussion about course material and projects Questions about homework, labs and lectures


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


All assignments, your midterm, and the final project videos and reports should be submitted on Gradescope. Use the code 5V8PPE 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 contain some theoretical questions and also implementations 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) a final project with a 1-2 page report (3 unit version) or a 6-8 page conference paper style report (4 unit version) as well as a 1 page project proposal (3 and 4 unit versions). The 5-unit WIM option additionally requires weekly writing assignments and participation in 2 workshops.


This is an experimental class. Enrollment is limited to 50 students. The enrollment cap is due to the limited number of hardware kits we have available and although we used to allow teams of 2 students to share one in the past, the current COVID-19 situation requires us to send one hardware kit to each student (hence the lower enrollment cap). If you did not get a chance to enroll, watch the first few classes anyway and sign up for the waiting list. In the past, students dropped the course and everyone on the waiting list was able to get in, so so don't panic!

Course Projects, Project Proposal, and Final Report

You can work in teams of up to 3 students for the project, although most students will probably work by themselves. Submit only one proposal and final report for each team to gradescope. The expected amount of work is relative to the number of team members, so if two teams work on a similar project, we'd expect less work from a smaller team. Before you start to work on the proposal or the report, take a look at some of the past project proposals and reports to give you sense for what's expected.

The project proposal is a 1-2 page document that should contain the following elements: clear motivation of your idea, a discussion of related work along at least 3 scientific references (i.e., scientific papers not blog articles or websites), an overview of what exactly your project is about and what the final goals are, milestones for your team with a timeline and intermediate goals. Once you send us your proposal, we may ask you to revise it and we will assign a project mentor to your team.

The format of the final project report depends on the number of units you take. If you are enrolled in the 3-unit version, please submit a 2-page project report that proves a concise summary of your project and maybe add 1-2 screenshots. If you are taking the 4-unit or 5-unit (WIM) version, your report should look like a short (~6 pages) conference paper. We expect the following sections for this format, which are standard practice for conference papers: abstract, introduction, related work, theory (i.e., your approach), analysis and evaluation, results, discussion and conclusion, references. To make your life easier, we provide an MS Word and a LaTex template that you can use to get started on your report (see syllabus).

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 required to be completed before starting to work on the weekly assignment. We will release the lab writeup every Friday.

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 Ed Discussion. 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 using the course staff mailing list.

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!

Robert Konrad and Nitish Padmanaban have contributed significantly to developing this course - thanks Robert and Nitish!

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.