This is an archive of a past semester of this course. Go to the current semester.
Final Project Ideas - Project Extension

# Extending Project 1

## OpenGL Simulator (Difficulty Level: 2.0)

By the end of this project, we are able to rasterize planar triangles onto the screen. To make it even better, we can try simulating the entire pipeline in OpenGL! Specifically, given triangular meshes, camera information, lighting conditions and transformations, etc., we can project these triangles onto the screen, rasterize them, perform z-tests, and apply shaders. Although this simulation runs on the CPU, we can still achieve real-time performance!

# Extending Project 2

## Displacement Maps using Dynamic Tessellation (Difficulty Level: 2.5)

In project 3-2, we implemented displacement maps to change the geometry of an object and add stunning surface details. However, in order to capture fine details, extremely high-poly underlying mesh with very small triangles is required. To solve this problem, we can use dynamic tessellation. It breaks down large polygons into finer pieces only when needed, according to the details specified by displace maps. After that, it sends the dynamically subdivided mesh to the graphics pipeline. By taking this project, you'll learn the state of the art technology for video games! You may also be able to learn DirectX or CUDA-OpenGL interop.

## Mesh simplification & Remeshing (Difficulty Level: 1.5)

Sometimes a triangular mesh uses far more triangles than needed, wasting storage space and demanding more computation time than necessary. To solve this, we can perform mesh simplification, in which we find areas where fewer triangles can be used and then simplify those areas accordingly. In addition, it is also possible to find a better discrete representation of the same surface. Transforming the mesh into this better representation is called remeshing.

# Extending Project 3

## Bidirectional Path Tracing & Multiple Importance Sampling (Difficulty Level: 3.0)

Path tracing is not almighty. When there are caustics or glossy inter-reflections, it performs poorly. To deal with that, we can implement BDPT (Bidirectional Path Tracing) by shooting half-paths from both the camera and the light, then connecting them somewhere in between.

Also, remember that in this project, when the roughness of a surface is low, our renderings will tend to be quite noisy. To reduce this noise, we can use multiple importance sampling (MIS), which is also a necessary component of implmementing BDPT.

## Light field camera support (Difficulty Level: 2.0)

Project 3 uses either a pin-hole camera or a thin lens when ray tracing scenes. We can extend it to use a light field camera, where each pixel now becomes a grid recording radiance from different directions. Using this grid, we can then move around the aperture and refocus even after the scene has already been rendered. Render some light field images, and implement a nice GUI to show off your results!

## Screen Space Ambient Occlusion (Difficulty Level: 2.0)

In project 3-2, you've implemented Phong shading. You may still remember that the ambient term is a constant and doesn't seem interesting. Ambient Occlusion (AO) is a way to increase the realism of the ambient term. (Some advanced methods may even be able to fake the global illumination!) Theoretically, Ambient Occlusion shoots shadow rays uniformly on the hemisphere to see how many rays are blocked within a certain distance. But Screen Space Ambient Occlusion (SSAO) can approximate this just in the image plane, and is real-time, and is pervasively used in video games!

## Add texture support for our project framework (Difficulty Level: 1.5)

Our project framework (path tracer for assignment 3-1 and 3-2) still doesn't support textures! But you can make it work :)

# Extending Project 4

## Cloth Simulation using OpenGL shader (Difficulty Level: 2.5)

We can extend the CPU cloth simulation onto the GPU using OpenGL shaders, which are powerful enough to achieve this parallelization without needing to touch CUDA. Here is a ShaderToy demo. With this, we can improve our cloth simulation project with better accuracy as well as implement additional features such as accurate self-collision!