4118 EBU3B (CS Bldg)
Office Hours: Tu 11:30-12:30, Th 11:00-12:00 (after class) in 4118 EBU3B or e-mail for appointment other times.
Office Hours: Tu 11:30am-1:30pm
Sections: W 8-10pm
Office Hours: F 3-5pm
Sections: W 4-6pm
Office Hours: M 1-3pm
Sections: W 6-8pm
Office Hours: Th 1:30-3:30pm
Office Hours: M 10-12
Note the tabs/links on top of this page. In particular, see the overview tab for an overview of course infrastructure.
We are using Piazza as the primary method of communication. Please sign up for the UCSD winter 2023 cse 167 class (the roster is linked to canvas, so you should be added automatically, let course staff know if there is an issue; it is CSE167_WI23_A00).
Please see the Course Schedule for a detailed syllabus and lecture slides.
Any administrative questions or questions not related to class material can be directed at email@example.com.
Parts of this course have been run for the past 10+ years as a massive open online course (MOOC) at edX as CSE 167x, and earlier as UC Berkeley's CS 184.1x. To give you access to the resources developed for the MOOC, we are introducing several experimental features. First, considerable course material including automatic feedback systems are available at UCSD Online. We will be running most assignments through UCSD Online, with automatic feedback systems, so you will need to register for an account and sign up for the course there. Please consult the Assignments page for more details. Second, we are making online lectures for parts of the course available (also available on both the public edX and UCSD Online sites; these were originally made in summer 2012 for CS 184 at Berkeley). Please note that we have somewhat upgraded the course material in this offering to introduce modern OpenGL.
Note that the online resources are provided as a very useful supplement to the in-person lectures (but they are optional, apart from the compulsory use of the UCSD Online feedback systems), and the policies and course material of the in-class offering always take precedence. Moreover, grading in the course will be finalized by the local tutor/grader, who will rely on and require the UCSD Online feedback systems as a guide but reserves the right to test additional cases and revise scores in the interest of fairness.
If you are interested in graphics research at UC San Diego more information can be found here.
We encourage you to make use of the Piazza newsgroup. Feel free to send the TAs or instructor an email, or attend office hours if Piazza doesn't solve your problem, or if you would like to discuss course material. Please note that Piazza will generally have the fastest response time, and your question is likely to be of interest to others.
This course is an introduction to the foundations of 3-dimensional computer graphics. Topics covered include 2D and 3D transformations, interactive 3D graphics programming with OpenGL, shading and lighting models, geometric modeling using Bézier and B-Spline curves, computer graphics rendering including ray tracing, texture mapping, and basic animation. There will be an emphasis on both the mathematical and geometric aspects of graphics, as well as the ability to write complete 3D graphics programs. We almost always offer 167 twice (Prof. Albert Chern will teach it in the fall, with slightly different content).
This will be a hopefully fun course, but will require considerable implementation and understanding. This is especially so, since the required programming for some of the assignments is difficult, and since graphics programming in general, and especially coding in OpenGL and GLSL is a new skill. Debugging and working with graphical programs requires substantial work, which is difficult to replace by teaching it theoretically. The main advice is to START EARLY on all of the programming assignments and ask the instructor or teaching assistants if you run into any difficulties; we are always ready to help. If an assignment provides 2 or 3 weeks to do it, it usually means you need (part of) all 2 or 3 weeks, and cannot start a few days before the deadline. Most students should successfully complete the assignments, and find the course very rewarding and fun, with the ability to understand the theory behind and implement 3D graphics programs. Some students every year are able to use the course as a springboard to pursue graduate study in computer graphics, or to take up positions in the graphics industry.
This is the introductory graphics course. There are a number of follow-on courses in spring quarter, which I recommend if you are interested and do well in CSE 167. Most notably is CSE 168 on computer graphics II: rendering, which follows up where this course leaves off (taught this year by Prof. Tzu-Mao Li; I have taught it the past couple of years). Steve Rotenberg and Ben Ochoa will likely be teaching graduate courses on physical simulation and computational photography respectively in spring quarter (CSE 273,291). We will hopefully also be offering the virtual reality course (Prof. Schulze, CSE 165). There are also courses in computer vision and related areas that may be of interest.
Prior knowledge of computer graphics, OpenGL or GLSL is NOT required.
(We are aware that not all students are familiar with C/C++, but most pick it up without difficulties. If you are concerned about this aspect, we recommend that you study up before the class and speak to the TAs to come up to speed quickly. We do not spend any time in class teaching C/C++, since this is an upper division course).
Lectures and sections will be held as noted at the top of the page.
Assignments comprise four projects (plus assignment 0), comprising primarily of programming. All projects are due by 11:59pm Pacific Time on the dates specified. You should plan ahead; in general, we will not accept excuses for server crashes, last minute delays uploading and so on close to the deadline. The final ray tracing programming assignment may optionally be completed in groups of two (requirements will be slightly more than if you were working alone). This final raytracing assignment is very challenging, likely the most difficult assignment you will do in UCSD CSE, so we highly encourage doing it in a group of two. For more detail, see the assignments page. In this case, it is your responsibility to make sure that you both contribute equally. That is, we cannot accept "half" of an assignment from you if your partner failed to do his/her part. Please note that all assignments are to be done individually except for homework 4.
One successful experiment in both past local courses and the online edX class is to have instant feedback servers to provide automatic feedback on all of the assignments. You upload your program or images, and the server produces a comparison with the true solution and a difference image. You can submit as many times as you like to the feedback servers as you improve your assignment. When you are satisfied, indicate the final feedback output in your submission. This year, using the feedback servers is compulsory, and all assignment submissions must include a link to the feedback server output. Please note that while we use the feedback server scores for the online courses, we will grade using the feedback output only as advisory for CSE 167. We may use other test cases, inspect code, and grade fairly based on the extent of the error. The feedback servers will be available via UCSD Online for most assignments (standalone servers will be announced when appropriate on Piazza, and the class mailing list, for the curves assignment; we can also try giving access to previous edX edge feedback server versions if necessary).
Late Policy: Your grade will be reduced 15% (of your actual score) for each 12 hours late (or 30% per day). The late deduction is a step function. That is, you lose 15% of your score for being 1 min late or for being 11 hours 59 minutes late. You lose 30% of your score for being 12 hours and 1 minute late. After 3 days, no credit will be given. No extensions will normally be given, unless for very compelling personal reasons. Additionally, a stronger late policy may be followed for the final assignment to allow for timely grading. Also, if you do want an extension, you must ask for it as far in advance as possible, clearly stating the reason why; we will not usually give extensions close to the deadline or after the fact, except for clear emergencies and clearly unforeseeable circumstances. To avoid most of these issues, please START EARLY!
In addition to the programming projects, we will have a midterm and a small take-home written assignment in lieu of a final. The midterm will be in class. As noted above, there will be no formal final exam. We will go over some review questions in classes specially designated for that purpose. Doing well on the midterm will require following the material at the level of the content covered in the review sessions, as well as a basic understanding of course material. Some previous midterm and final questions are posted at the bottom of the assignments page.
Finally, please note that this course emphasizes programming, as in the four major homework assignments; these carry a much greater percentage of the grade than the midterm and written assignment, but you will likely want to do well in the latter as well to make the best final grade.
Programming projects are to be implemented individually (except for the final project 4 which can [and highly recommended] be done in groups of two) from scratch. That is, you should not derive solutions from existing sources or previous instances of this course (including previous postings from the online course, at other universities etc). Discussion of programming projects is allowed (encouraged). Copying of solutions or code from other students, or from students who previously took this course in any university or online setting is not allowed. If you do obtain substantial help from the instructor, teaching assistant/tutor or another student, you must document this in your program. Furthermore, you should in general not copy code from other sources. If in doubt, please ask. Further specifics are given in the assignment specifications. Some assignments have skeleton code, others less so. You may feel free to re-use code from your own previous assignments at any time, particularly to handle window setup and interaction. (However, where required, you should follow the skeleton and only modify the required files for HW 0,1,2 and 3).
To repeat, you may not copy solutions or code from other students, or students who previously took this or a similar class at a university or online. You must clearly declare any code and ideas that came directly from others, as opposed to what you created yourself. If you fail to do so, we can only assume you are presenting your own work. Of course, presenting other people's work as your own is academic dishonesty. Note also that in group assignments (project 4 if you choose to do it in a group of two), you are collectively responsible for your project; both you and your partner can be held liable (just as you both receive credit for) the resulting assignment. Students who engage in dishonest activities, with an intent to alter their grade, will receive an F for the course and be reported to the University for further action. Note that you will also be held liable for publicly posting your code on github or other public websites, if another student subsequently copies from it (please do not post your code on github, website or any other publicly accessible location, nor copy from any such resources you find online).
To detect instances of academic integrity violations in programming assignments, we will use 3rd party software. We recommend you only include your class lab account ID (not your name or PID) in your submission codes (program files). Including your name and/or PID will disclose that information to the 3rd party.
Most of the assignments are based on OpenGL, a portable graphics library. Since everything about these assignments is portable, you can do them on any computer you want. We have tested the skeleton code on, and provide versions for Mac OS, Windows and Linux. Moreover, the code at least works under Windows in the basement lab B260, in Debug Mode, but likely will also work in other labs and under Linux (most recently it has been tested and found working on lab machines in B240). In fact, one of the initial goals is to get set up with a suitable compilation environment. If there are issues, please speak to the instructor or teaching assistant.
Your final grades will be computed by weighting the assignments tentatively as follows (instructor reserves the right to change final weighting). Two-thirds of the grade is given for the homework assignments, and one-third for the midterm and final written assignment. (Please ignore the weighting scores on UCSD Online).
I would first like to note that it is difficult to find a suitable graphics textbook; they all have their disadvantages. For some (many) of the topics, we will not be following any particular textbook. While it is useful to have a graphics text as a reference, it is not required, and this course is listed as having no required texts. You may also be interested in the 5 minute videos prepared by Steve Seitz and colleagues at the University of Washington, here.
If you do want to purchase a text, you might want to consider some version of the OpenGL and GLSL books as a reference; otherwise you will constantly be looking things up online (which is ok too; there are many good tutorials available). As far as what the course tests, and therefore what you need to focus on in the reading, it will be based entirely on the lecture material, and for the most part, we provide online lectures for review. We note here some of the texts we recommend, along with commentary on the book's suitability.
If these books are not available in the campus bookstore or nearby stores, they are readily available with online booksellers like Amazon. Note also that previous editions of a textbook are generally adequate.
This is a comprehensive tutorial on the Graphics API we will be using for most of the course. The source code for most of the examples in the book is also available at OpenGL-RedBook, which can be a very useful resource (even if you don't buy the book). If you ever intend to write substantial graphics programs, you should have this book. If you don't buy it, you're probably going to be sharing someone else's, or trying to decipher sample code. Please note that you will be using this primarily as a reference, looking things up as and when you write code. In practice, you will gain more by actually doing and looking up what you don't know, rather than just reading the red book end to end. Also please note that the latest edition involves many changes (as the graphics pipeline itself has evolved in recent years). We will not in general be focusing on all the new features, so an old edition is probably ok, but we will touch on some recent developments, in particular the use of programmable shaders in OpenGL.
This is the standard tutorial on the GLSL programmable shading system, that we will be using throughout the course. While the basics of GLSL are covered in the red book, I would highly recommend getting the orange book for a better explanation and deeper coverage. You may be able to get both red and orange books together as a package, and could also save on costs by getting the ebooks (since you will likely use these as a reference in any case). Note that the package above is the seventh edition, covering OpenGL 3.0 and 3.1 as used in the course; the newer red book editions cover more recent OpenGL versions that we will not be studying in this course.
This is a fairly simple text. The fifth edition is considerably expanded and (for reference only), we provide the chapters for the topics we cover in the course (we will cover essentially material corresponding to the first two-thirds of this book, or the first 15 chapters). The advantage is that it is easy to follow to get some understanding of the topics. The disadvantage is that the approach and content to the various topics may not quite follow the lectures, and some topics may be treated too simply or not very well at all. Most students like this textbook, and you should consider having it. However, it may not suffice well for all the material, and we will be closely following it only in the initial stages of the course. I have listed this as optional, not recommended, since there are a lot of textbooks for the class and we don't follow it exactly. It is far more important to get the OpenGL books if you are interested in buying something.
This is widely regarded as the bible of computer graphics, and is a comprehensive text. If you have further interest in graphics, like are considering taking the more advanced courses in the spring and next year, I would definitely recommend getting this. If not, I would still recommend being able to follow up in it, in case there are certain topics you want to see in more detail. The main disadvantage is the encyclopedic nature of the text, making the exposition quite complicated, that can go over the head for many students taking graphics for the first time.
This is a useful reference for implementing the raytracer in assignment 4. Some parts of this will be handed out in class. There are many newer textbooks on ray tracing and rendering, including Glassner's encyclopedic two-volume work on Principles of Digital Image Synthesis. These are all older books; for the latest techniques, you may want to look at the Real-Time Rendering resources and Ray-Tracing Gems series.
In addition to the above, a number of other basic and advanced texts may be of interest for specific parts of the class, such as