Extending Project 1
OpenGL Simulator (★★)
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 (★★☆)
Using displacement maps, we can change the geometry of an object and add stunning surface details. Tessellation is one method of breaking down polygons into finer pieces, which is perfect for implementing displacement maps. First, subdivide the surface until the mesh is fine enough to capture the details defined in displacement maps, and then apply the displacement maps to add the details. For this project, your results do not have to run in real-time.
You'll find this article interesting and useful.
Mesh simplification & Remeshing (★★)
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 (★★★)
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 (★★)
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!
GPU path tracer using NVIDIA OptiX (★★)
NVIDIA OptiX is a cool set of APIs built on top of CUDA to allow GPU ray tracing. It natively supports efficient BVH construction and ray-triangle intersection. We can write a path tracer on GPU using OptiX to support all effects in project 3. As a reward, we can expect a 10x speed up!
Extending Project 4
Cloth Simulation using OpenGL shader (★★☆)
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!