CPSC 424, Fall 2017
Final Project Guidelines and Ideas
The final project for CPSC 424 is due at the regularly
scheduled final exam period for the course: Tuesday,
December 12, at 7:00 PM. There is no final exam. The final
exam period will be used for student presentations of their
final projects. (Depending on how many people do team projects, it might
be necessary to move some of the presentations to the last
week of classes. However, the project itself will still be
due at the final exam period.)
Each student will choose an individual final project, in
consultation with the professor. It is possible that two,
or even three, students might work together on a project,
if the project is sufficiently complex. All projects, whether
individual or team, will have to be approved in advance. All the
projects should be different, so it will be good to choose a
project early, before someone else grabs the topic that you want.
Schedule
- October 16 – November 2. Consider topics for the project.
Meet at least once with the professor to discuss ideas. Get preliminary
approval for a selected topic. Remember that if someone else gets a topic
approved, then that topic is no longer available for other people!
- Friday, November 3. Turn in a written project proposal, including
a short plan for completing the project.
- Monday, November 20. Turn in a written progress report, including
a more detailed outline or design for the project.
- November 27 – December 11. Meet with professor to discuss
progress and plans. (Maybe some presentations on December 7 and 8.)
- Tuesday, December 12. Presentations; projects due.
Possible Project Types
- Research paper on a topic in computer graphics, with no programming or practical work.
The paper should be eight to twelve pages, and it must have properly formatted
footnotes and bibliography. (Example: Write a research paper about ray-tracing.)
This would ordinarly be an individual project, but two coordinated papers on related topics
would also be a possibility.
- Short paper plus programming project. A project of this type would involve
writing a program that implements some graphics technique or algorithm (or possibly
a program that uses a library that implements the algorithm), and writing a shorter,
less formal paper to discuss the technique and what the program does with it.
(Example: Write about the "stencil buffer" and write some WebGL demos that use it.)
- Short paper plus practical work. A project of this type would involve
investigating some topic in computer graphics, working with one or more programs
related to that topic, and writing a shorter, less formal paper about the topic.
For this type of project, you would use other people's programs rather than
write your own. (Example: Learn about the Blender physics engine, use it in some
Blender projects, and write about it.)
- Programming. Write a non-trivial computer graphics program, or design and
write some sort of graphics API.
Ideas
Here, in no particular order, are some possible topics, to help get you started
thinking. You can choose one of these topics, or a variation on one of them, or come
up with something entirely different. But remember that whatever your topic is, you have
to get it approved.
- Ray tracing, which will be discussed briefly in class. Write a research paper. Or program
a small ray-tracing demo, and explain how it works. Or learn to use a ray-tracing program
such as POV-Ray, use it to make a few ray-traced images, and report on its scene description language.
- Computer graphics in the movies. Could be a research paper. Or, for example, learn about green screen,
and maybe program it or use it in the Blender sequencer.
- Motion capture. Investigate how this animation technique is done and how it is used in
computer games and movies.
- Blender advanced lighting. Learn about some of the more advanced lighting features in Blender,
such as ambient occlusion, subsurface scattering, and area lights. Use them in some Blender
projects, and write about them.
- Blender character animation. Learn about constructing and animating characters, and try
to get one working.
- Blender physics engine. Learn what the physics engine can do and how it is used in
animations, and make some demos.
- Blender particle systems. Learn more about particle systems and their many options in Blender,
and make some interesting demos. (Make some hair!)
- A research paper on graphics and video file formats.
- 3D Modeling for 3D Printing. Make some models, maybe in Blender, and print them.
3D printing could also be a topic for a research paper.
- Game Engines. Download one of the free game engines, which have been used for professional
computer games, and do something with it! For example: Unreal Engine or Unity 3D.
- Spatial partitioning algorithms. Look at quad trees, oct trees, and/or BSP (Binary Space
Partition) trees and how they are used. For example, BSP trees can be used as part of the
implementation of the painter's algorithm. And spatial partition data structures are used
in computer games and general graphics processing for things like more efficient rendering
and collision detection.
- Collision detection. How is it actually done? Could be a paper, or a program that
uses it. (How about a "moving balls" animation where the balls bounce off each other
as well as bouncing off the walls?)
- CSG (Constructive Solid Geometry). A geometrical technique for modeling solids in
computer graphics.
- Global Illumination Algorithms for more realistic lighting. According to
Wikipedia, this can include "Radiosity, ray tracing, beam tracing, cone tracing, path tracing,
Metropolis light transport, ambient occlusion, photon mapping, and image based lighting."
We will see at the end of the course how the Cycles renderer in Blender uses path tracing
for more realistic graphics, but you could look at the topic in more depth.
- PBR (physically based rendering) has become a hot topic. Find out more about it and
the notion of "material" that it uses. Maybe look at the "principled shader" in the
latest, unstable version of Blender (2.79).
- Modern OpenGL. Look into OpenGL 4.5. What are some of the things it can do that
we haven't learned about? In particular, you might look at other kinds of shader
program (geometry, tessellation, compute). It might be interesting to write a graphics
program that uses a compute shader.
- After OpenGL. The Khronos group (who manage OpenGL) has developed a successor API to
OpenGL, named Vulcan. What is it? What will it be able to do? Why the change? Or do some
sample programs using Vulcan, if you can find a platform that supports it.
- Direct 3D, the Windows 3D Graphics API. How does it differ from OpenGL? What is the history
of OpenGL vs. Direct 3D? How do you write programs for it? (Maybe write something.)
- Graphics Hardware. Write a paper about the hardware architecture of modern GPUs. Learn how they
implement parallel processing and how they organize memory. Find out how a TPU
(texture processing unit) works.
- GPGPU (General Purpose computing on Graphics Processing Units). Systems such as
Cuda and OpenCL let programmers use GPUs for computing that has nothing to do with
graphics. This can bring tremendous computing power to bear on certain types of
problems including, for example, Bitcoin mining. This could be a research paper—or maybe you could even write some
simple OpenCL or Cuda programs.
- Krita. I read somewhere about a project had used the well-known open source graphics
programs Gimp, Inkscape, Blender, and Krita. I don't know Krita. Find out what it is,
use it, and report on it.
- Write a scene graph API for WebGL (yes, we already have three.js, but writing a simpler
API could be a good learning experience).
- If you know some mobile development,
write an OpenGL program for iOS or Android, using their built-in support for OpenGL ES.
- Write Blender. (Well, not quite Blender, but a simple program that lets the user do
some interactive 3D modeling.) Or, write Gimp, or Inkscape.
- Write a game in WebGL or Three.js.
- Make a WebGL chess game. Model the pieces in Blender, and import them into Three.js (where
you have the Raycaster to help with input). This could be a natural two-person project.
- Write a WebGL program that implements particle systems and does something interesting
with them. Or write a particle system engine for WebGL, with some basic physics.
- Write any kind of useful computer graphics program.
- Write a very simple Game Engine for OpenGL, WebGL, or Three.js. I don't know exactly
what this would mean, but hey, that's what research is for!