Recommended Technical Features

We suggest referring to this document while working on both Project 6: Final Project Gear Up and Project 7: Final Project. See the instructions in each handout for more info on what we're looking for.

Feature Tracks: Below, we group related features into tracks. Features in tracks can build on each other, so you should implement them in order. Some features depend on features in other tracks, and these dependencies are listed in the tables below.

You don't have to complete a track all the way to the end, but be careful about picking features that depend on ones you haven't done yet! For example, don't try to do inverse kinematics without a proper skeletal animation system.

This list is by no means exhaustive! You are welcome to implement features not listed here, but please discuss them with a TA or the professor first, so we can determine an appropriate point value.

Feature Point Values: Each feature has a star rating (⭐) indicating its relative difficulty and point value. Each star corresponds to 20 points, so the point values for features are as follows:

  • ⭐ : 20 points
  • ⭐⭐ : 40 points
  • ⭐⭐⭐ : 60 points
  • ⭐⭐⭐⭐ : 80 points
  • ⭐⭐⭐⭐⭐ : 100 points

You can only get credit for features that you have not already implemented in previous projects.

Generic

FeatureDependenciesNotesDifficulty
Depth BuffersRealtime only!
G-BuffersDepth BuffersRealtime only!⭐⭐

Depth Buffers

Depth buffers store per-pixel depth information to determine which objects are in front of others. OpenGL computes a depth buffer by default, as long as GL_DEPTH_TEST is enabled. For this feature, you'll need to store that depth buffer in a texture that can be accessed in shaders.

G-Buffers

G-buffers (short for Geometry Buffers) store multiple per-pixel attributes such as normals, albedo, and material properties, enabling deferred shading for efficient lighting calculations.

Resources

Camera Effects

FeatureDependenciesNotesDifficulty
Ray Traced Depth of FieldDepth Buffers (Generic)Ray Tracing only
Screen Space Depth of FieldDepth Buffers (Generic)Realtime only!⭐⭐
Lens AssembliesRay Tracing only!⭐⭐⭐⭐⭐
Ray Traced Motion BlurRay Tracing only!⭐⭐
Screen Space Motion BlurG-Buffers (Generic)Realtime only!⭐⭐
Camera Paths⭐⭐

Ray Traced Depth of Field

Tracing rays from non-pinhole camera (i.e. a lens with finite aperture) to simulate realistic defocus blur effects.

Resources

Screen Space Depth of Field

Mimicking depth of field effects as a screen space post-processing effect by blurring pixels based on their depth relative to the focal plane.

Resources

Lens Assemblies

Simulating physically realistic camera lenses by tracing rays through multiple lens elements to capture effects like distortion and chromatic aberration.

Resources

Ray Traced Motion Blur

Tracing rays over a time interval to simulate motion blur for fast-moving objects or camera motion.

Resources

Screen Space Motion Blur

Applying motion blur as a screen space post-processing effect by blurring pixels based on the velocity of the objects they cover. Per pixel velocity can be written to two channels of a G-buffer.

Resources

Camera Paths

Allow the camera to move along predefined splines or curves. Useful for cinematic shots and cutscenes.

Resources

Lighting Pipeline

FeatureDependenciesNotesDifficulty
Deferred LightingG-Buffers (Generic)Realtime only!⭐⭐⭐
Ray Traced Ambient OcclusionRay Tracing only!⭐⭐⭐
Screen Space Ambient OcclusionDeferred LightingRealtime only!⭐⭐⭐
Screen Space BloomRealtime only!⭐⭐

Deferred Lighting

Calculates lighting in screen space after geometry rendering, allowing effecient handling of many lights.

Resources

Ray Traced Ambient Occlusion

Use ray tracing from surface points to determine what percentage visible/occluded they are. This percentage is used to modulate the ambient term in the lighting equation, leading to realistic darkening in corners and crevices.

Resources

Screen Space Ambient Occlusion

Approximate ambient occlusion using depth information in screen space. Much faster than ray traced ambient occlusion but less accurate.

Resources

Screen Space Bloom

Emphasize bright light sources by adding a glow around them. The glow is created by blurring bright areas of the image and compositing them back to the original image.

Resources

Shadows

FeatureDependenciesNotesDifficulty
Shadow MappingDepth Buffers (Generic)Realtime only!⭐⭐⭐
Shadow VolumesRealtime only!⭐⭐⭐
Realtime Soft ShadowsShadow MappingRealtime only!⭐⭐
Ray Traced Soft ShadowsRay Tracing only!⭐⭐
Image-based LightingRay Traced Soft ShadowsRay Tracing only!

Shadow Mapping

Create shadows by rendering the scene from the light’s perspective into a depth map, then using these depths to check whether points visible from the camera are blocked from seeing the light.

Resources

Shadow Volumes

Create hard-edged shadows extruding silhouette edges from meshes to create volumes representing shadowed regions of space. Can be implemented efficiently in OpenGL using the stencil buffer.

Resources

Realtime Soft Shadows

Soften the edges of shadows by using multiple pixels in the shadow map to determine how much a point is shadowed. Also known as Percentage Closer Filtering (PCF). More sophisticated variants exist (e.g. Cascaded Shadow Maps, Variance Shadow Maps).

Resources

Ray Traced Soft Shadows

Compute soft shadows by tracing multiple shadow rays from a surface point to an area light source.

Resources

Image-based Lighting

Wrap your scene in an environment map and treat it as a giant area light source to create realistic ambient lighting, shadows, and reflections.

Resources

Volumetrics

FeatureDependenciesNotesDifficulty
Realtime FogDepth BufferRealtime only!
Crepuscular RaysRealtime only!⭐⭐⭐
Volume Ray TracingRay Tracing only!⭐⭐⭐⭐

Realtime Fog

Add atmospheric haze based on distance from the camera.

Resources

Crepuscular Rays

Crepuscular rays (colloquially known as "god rays") are the visible light shafts that form when sunlight passes through gaps in clouds or other obstacles. These can be simulated efficiently in real-time using screen-space techniques.

Resources

Volume Ray Tracing

Render volumetric data by tracing rays through the volume and accumulating volumetric density along the ray path.

Resources

Animation

FeatureDependenciesNotesDifficulty
Kinematic Skeletons⭐⭐
Linear Blend SkinningKinematic Skeletons⭐⭐
Inverse KinematicsKinematic Skeletons⭐⭐⭐⭐

Kinematic Skeletons

Create a hierarchical structure of connected, articulatable bones to control character movement.

Resources

Linear Blend Skinning

Deform a character's mesh based on the transformations of its underlying skeleton using weighted vertex influences.

Resources

Inverse Kinematics

Calculate joint angles needed to position an end effector (like a hand or foot) at a desired location, allowing for more intuitive animation control.

Resources
  • Wikipedia: describes the Jacobian (Pseudo)inverse method for solving IK; also references Cyclic Coordinate Descent (CCD), another popular approach.
  • Alan Zucconi blog post: more detailed walkthrough of solving IK for a robotic arm (using a finite-difference gradient descent approximation).

Physics

FeatureDependenciesNotesDifficulty
Rigid Body Translation⭐⭐
Rigid Body RotationRigid Body Translation⭐⭐⭐
Rigid Body ConstraintsRigid Body Rotation⭐⭐⭐⭐
Spring-Mass SystemsRigid Body Translation⭐⭐
Cloth SimulationSpring-Mass Systems⭐⭐⭐
Particle SystemsRealtime only!⭐⭐⭐

Rigid Body Translation

Simulate solid, non-deformable objects translating under the influence of forces like gravity.

Resources

Rigid Body Rotation

Simulate solid, non-deformable objects rotating under the influence of torques.

Resources

Rigid Body Constraints

Restrict the movement of rigid bodies to create realistic physical assemblies, such as hinges or chains.

Resources

Spring-Mass Systems

Approximately simulate the motion of deformable objects using a network of point masses connected by springs.

Resources

Cloth Simulation

Implement a spring-mass system specifically designed to simulate realistic cloth behavior, including bending and stretching.

Resources

Particle Systems

Simulate large numbers of small, independent objects interacting to create effects such as fire, smoke, rain, or sparks.

Resources

Realtime Post-Processing

FeatureDependenciesNotesDifficulty
Post-Processing PipelineRealtime only!⭐⭐
Sylized FiltersPost-Processing PipelineRealtime only!⭐⭐
Color GradingPost-Processing PipelineRealtime only!⭐⭐

Post-Processing Pipeline

Implement a basic framework to apply a series of image-space effects after rendering the scene. This involves multiple render passes and framebuffer management.

Resources

Stylized Filters

Apply non-photorealistic screen-space filters, such as edge detection, to achieve a specific artistic style.

Resources

Color Grading

Adjusts image colors to achieve a desired mood or cinematic tone.

Resources

Procedural Generation

FeatureDependenciesNotesDifficulty
L-Systems⭐⭐
3D FractalsRay Marching (Rendering)⭐⭐⭐
Wave Function Collapse⭐⭐⭐

L-Systems

L-Systems generate recursive, fractal-like structures, often used to model plants and trees.

Resources

3D Fractals

Implement a 3D fractal generation algorithm, such as the Mandelbulb. You'll need ray marching to visualize these fractals effectively.

Resources

Wave Function Collapse

Generate tile-based patterns that are locally similar to a given input example pattern.

Resources

There are many other procedural generation techniques not listed here (e.g. algorithms for procedural building and city generation)! Feel free to discuss other ideas with a TA or the professor. We encourage you to explore and get creative :)

Texture Effects

FeatureDependenciesNotesDifficulty
Normal Mapping⭐⭐
Bump Mapping⭐⭐⭐
Parallax MappingBump Mapping⭐⭐⭐
Scrolling Textures

Normal Mapping

Normal Mapping uses a texture to store surface normal perturbations, adding detailed surface features without increasing geometry complexity.

Resources

Bump Mapping

Like normal mapping, but uses a height map to simulate surface detail by perturbing surface normals during lighting calculations.

Resources

Parallax Mapping

Parallax Mapping enhances bump mapping by adjusting texture coordinates based on the view angle and height map, creating a more pronounced 3D effect.

Resources

Scrolling Textures

Animate textures over time, often used for moving water, clouds, or conveyor belts.

Resources

Geometry

FeatureDependenciesNotesDifficulty
Offline Bezier Surface Tesselation⭐⭐⭐⭐
Realtime Surface TesselationRealtime only!⭐⭐⭐
Geometry ShadersRealtime only!⭐⭐⭐

Offline Bezier Surface Tesselation

As a CPU preprocessing step, take a Bezier surface and tessellate it into triangles.

Resources

Realtime Surface Tesselation

Dynamically tessellate Bezier surfaces on the GPU using OpenGL tessellation shaders.

Resources

Geometry Shaders

Use OpenGL geometry shaders to manipulate and generate geometry on the GPU, such as turning points into billboard quads or densifying particle systems.

Resources

Rendering

FeatureDependenciesNotesDifficulty
Instanced RenderingRealtime only!
Acceleration StructuresRay Tracing only!⭐⭐⭐⭐
Ray Marching⭐⭐⭐
Sphere TracingRay Marching⭐⭐
HDR Rendering⭐⭐⭐
GPU Ray TracingRealtime only!⭐⭐⭐⭐⭐
PortalsRealtime only!⭐⭐⭐⭐⭐

Instanced Rendering

Instanced Rendering allows rendering many copies of an object efficiently with a single draw call. You'll need to demonstrate your implementation by rendering a scene with a huge number of repeated objects (e.g., a forest of trees) at high framerates.

Resources

Acceleration Structures

Acceleration Structures speed up ray tracing by organizing scene geometry for faster intersection tests.

Resources

Ray Marching

Render arbitary implicit surfaces (including fractals) by iteratively stepping along rays to find surface intersections.

Resources

Sphere Tracing

When your implicit surface is a signed distance field (SDF), you can use sphere tracing to efficiently find ray-surface intersections by taking steps proportional to the distance to the surface.

Resources

HDR Rendering

Make all of your lighting calculations use physical units of light intensity, then implement tone mapping to convert the resulting rendered hight-dynamic ranges (HDR) images to low-dynamic range (LDR) for display.

Resources

GPU Ray Tracing

There are many different frameworks for this, such as NVIDIA OptiX, DirectX Raytracing (DXR), and Vulkan Ray Tracing; any of these is acceptable.

Resources

Portals

Implement portal rendering, where looking through a portal shows a view into another part of the scene.

Resources