Course overview. Due to the Covid-19 shutdowns, this course will be completely "remote" for Spring 2020.
This course is a second course in 3D computer graphics, a continuation of Math 155A, covering the mathematical foundations of computer graphics and "modern" OpenGL programming. Topics covered include: Bézier curves, B-spline curves, shader programming, radiosity, ray tracing, kinematics and animation. The course grade will be equally based on exams/homeworks/quizes and on programming assignments. Because of the need to encourage interaction and engagement, the course grade will also be partly based on "participation" or "engagement".

Online textbook and other materials:

Textbook: 3D-Computer Graphics: A Mathematical Introduction with OpenGL, by S. Buss (your instructor). Math 155B will cover the second half of the textbook, starting with chapter 7 of the textbook and also including Chapter 3. The second edition to the textbook incorporates Modern OpenGL and other updates. Downloadable PDF copies will available to you at the link above. SO YOU SHOULD NOT PURCHASE THE TEXTBOOK.

Course prerequisites. Math 155A or CSE 167 are the primary prerequisites. Since the campus computer labs are likely to be closed for the quarter, it will be help to have a computer with a C++ compiler that can compile and run OpenGL programs: this should be OK on any Windows 10 (or 7) system, any Linux system, and most Macintosh's. Alternatively, you can develop C++ and OpenGL programs using remote login to UCSD's CloudLabs. The first week's assignment will address this requirement.

Class time/location:
   Zoom Meetings, Tuesday & Thursday 12:30-1:50pm.
   Section meetings with TA Jon Pham. On Zoom, time TBD.
   Office hours via zoom, and piazza discussion.

Class schedule as a google calendar: HTML link.

Instructor: Professor Sam Buss
   Office: N/A
   Email: sbuss@ucsd.edu
   Phone: 442-2877 (personal cell phone, area code 858)
   Office hours: Default office hours (see the calendar above for changes),
      Via Zoom: To be announced.
      Please message on piazza or email for personal meetings.

Teaching Assistant:

   Jonathan Pham.
      Email: j2pham@ucsd.edu
      Office hours: Default office hours (see the calendar above for changes),
         TO BE ANNOUNCED. Please see the calendar above.

Homework Assignments (Most answers will be available via gradescope answer key.)
   Homework #1. Gamma Correction and sRGB.
      Turnin via GradeScope (gradescope.com).
   Homework #2. Vertex and Fragment Shaders.
      Turnin via GradeScope (gradescope.com).
   Homework #3. Bezier Curves (first assignment).
      Turnin via GradeScope (gradescope.com).
   Homework #4. Bezier Curves (second assignment).
      Turnin via GradeScope (gradescope.com).
   Homework #5. Overhauser curves, Bezier patches, rational curves' derivatives.
      Turnin via GradeScope (gradescope.com).
   Homework #6. NURBS.
      Turnin via GradeScope (gradescope.com).
   Homework #7. NURBS, Geometry Shader, Basic Ray Tracing.
      Turnin via GradeScope (gradescope.com).
   Homework #8. Yaw-Pitch-Roll, Quaternions and Slerp-ing.
      Turnin via GradeScope (gradescope.com).

Programming Assignments Programming projects are personal projects. You may consult with other students, interact with other students. But you should not directly copy code. It is OK to see small pieces of another student's code, but you should not just cut-and-paste it into your own program. You should instead understand it, then take a short break, and type it in on your own. For example, if a student shows you how to call glTexParameter(), you might then look up the online documentation, understand how their code works, then set their code aside, and type your own code using the online documentation (not using the other student's code directly!). All substantial assistance must be acknowledged at the time you turn in your programming project.
   Project 0: Getting (Re)-started and GammaCorrectTest. Due April 3, 9:00pm. (Time extension available if needed.)
      Hand in on gradescope, a single PDF file.
   Project 1: Vertex and Fragment Shaders. Due April 14, 9:00pm.
      Hand in on gradescope, a single PDF file. Plus upload source code.
   Project 2: Color Dithering and Fragment Shaders. Due April 24, 9:00pm.
      Hand in on gradescope, a single PDF file. Plus upload source code.
   Project 3: Triangular Bumps with a Geometry Shader. Due May 7, 9:00pm.
      Hand in on gradescope, a single PDF file. Plus upload source code.
   Project 4: Getting Started with Ray Tracing. Due May 15, 11:00pm.
      Hand in on google drive, plus fill out a google forms questionnaire.
   Project 5: Distributed Ray Tracing. Due May 25, 10:00pm.
      Hand in on google drive.
   Project 6: Final independent project. Due June 10.
      Hand in on google drive.

Prerecorded presentations, and recordings of the main class meetings will be available. Please note that by attending class, you are consenting to be recorded. Conversely, to respect your fellow students' privacy, please do not circulate or distribute or repost class recordings. All course materials are subject to copyright restrictions.

Midterm and final exam schedule: "Mini" Midterms on Thursdays of weeks 3, 5, 7, and 9.
    Mini-Midterm #1: Thursday, April 16, approximately 12:45-1:30. "cheat sheet". Study Problems.
    Mini-Midterm #2: Thursday, April 30, 45 minutes within 12:00-4:00. "cheat sheet". Study Problems.
    Mini-Midterm #3: Thursday, May 14, 45 minutes within 12:00-4:00. "cheat sheet" (same one as for Mini-midterm #2). Study Problems.
    Mini-Midterm #4: Thursday, May 28, 45 minutes---exact times TBA. Study Problems. There is no cheat sheet for mini-midterm 4.
    Final Exam: Monday, June 8, 2 hours. Within 11:30am-2:30pm. Partially cumulative. Additional Study Problems. Updated "cheat sheet" is available for download.

In class quizes:
   Dates and topics to be pre-announced in class and on piazza.
   These will be online quizes, lasting 15+ minutes.
   When available, quizes can be downloaded from: Quiz #1, Quiz #2, Quiz #3, Quiz #4, Quiz #5, Quiz #6, Quiz #7.

Academic Integrity: All assignments come with an academic integrity pledge. For quizes, midterms and the final, you must work on your own with no assistance or electronic resources, unless you receive alternate instructions. For homeworks and programming projects, you may consult fellow students, internet resources, the textbook, etc., but you must keep a record of and report all significant sources of help. E.g. any particularly helpful web page, any student who helped you in a substantial way, etc., must be reported at the same time as when you hand in the assignment.
One major item that is not permitted is accessing code from solutions turned in by students in prior years.

Computer Labs The APM basement computer labs are no longer available. Instead development must be done on your personal computer.
   Grading of programming projects will be one-on-one with TA Job Pham or Professor Buss in a Zoom session.
   We will work out a system for Mac users to transfer their files for re-compilation in Visual Studio on Windows.

Piazza. Please watch piazza for important course announcements. You are strongly encouraged to post questions (and answer questions as well). An example of what you might post is a screenshot of your program's output, asking about what the problem might be. However, do not post code from your programming assignment!
If you are taking the course, but not yet officially enrolled, please email Professor Buss for an invitation to the piazza course page.

Grading: The grading policy and percentages may change. We will discuss this more in our class Zoom meetings.
Tentatively: the course grade will be based 40% on programming assignments, 40% on homeworks, short quizes, midterms and the final, and (NEW) 20% on "Engagement". There will be four midterms, each about half the length of a typical midterm. The final will count the same as two midterms. You may drop your lowest midterm score, or half of the final exam score. The homework assignments and quizes will be together 8% of the grade. There will be approximately 8 quizes or maybe more, exact number to be determined. You may drop the lowest 1 quiz if there are 5 or fewer, and the lower 2 quizes if there are more than 5, lowest three quizes if there are more than 9. Quiz topics will be pre-announced; they will take approximately 15 minutes to complete.

"Engagment" means actively interacting with and participating in the course, interacting with other students, assisting and getting assistance from other students, possibly doing independent readings that contribute to the course. Examples of engagement might include: (a) Attending Zoom lectures in real time and contributing questions and answers and discussion. (b) Watching prerecorded videos before the lecture, and posting comments or questions to piazza for class discussion.(c) Watching recorded class meetings and posting comments or questions to piazza. (d) Contributing to piazza discussions; answering questions on piazza, asking questions on piazza. (e) Working with other students in a way that fosters learning; for example, giving advice on homework or programming projects. (Must be disclosed!) (f) Or even doing some independent studying on a topic related to the course, and making a short presentation or writeup for your fellow students. You do NOT need to do all of these things! But you should do some of them consistently throughout the course. You should do it in a way that is visible to your professor, your TA, and other students in the course.
The point of engagement to counteract the potentially isolating effects of the shutdown and the remote learning. In the end, I hope everyone gets full credit for the engagement portion of the course.

Other resources

The upgraded course textbook web page has some introductory sample OpenGL programs (some of them are still under development). I highly recommend them as a way to see examples of how Modern OpenGL is used.

Another excellent source for learning how to use OpenGL is the web pages by Joey De Vries at https://learnopengl.com. These provide both an introduction to OpenGL and discussion of more sophisticated language features. Another web site with nice tutorials is http://lighthouse3d.com. Many other tutorials and resources can be found at https://www.opengl.org. Last, but not least, the Khronos Group leads the development of OpenGL; if you do browser searches for topics in OpenGL, you are likely to find their web pages giving the most official version of the documentation.

If you are programming at home, you have free use of Visual Studio for use as a UCSD student. In addition, you probably need to install the OpenGL header files and .lib library files, GLFW and GLEW. To obtain these for Windows either see the next paragraph, or download the header files GL/glew.h, GLFW/glfw3.h and the binary static libraries glew3.lib, glew32s.lib, glew32.lib. These are then needed to be installed in your system directory (logging in as an administrator) in the default system include directory for headers and the default system directory for static libraries. You can search for GL/gl.h or GL/glu.h opengl32.lib or glu32.lib to find these system folders. These header and static library files can be obtained online from GLFW and GLEW distribution sites, at http://www.glfw.org/download.html and http://glew.sourceforge.net/.
For other systems, source files and makefiles are available for download to compile yourself.
More info for installing Visual Studio on Windows: The zip file GLEW_GLFW.zip has all the needed files and the instructions given to ACMS to install GLEW and GLFW for the computer lab last year. Similar instructions should work for most Windows 7 or 10 machines.
For Macs, students have been using Xcode. Your professor lacks experience in this, but quite a few students in 155A succeeded. If you are installing Xcode and GLFW and GLEW on a Mac, please post to piazza what you did, how easily it worked, and what websites you used. (This will count towards "Engagement Points".)