The Hellstrike
A full playthrough of "Hellstrike."
About the project
Doom Bowling started as the final project for my computer graphics course at CSULB and grew into a sandbox for real-time rendering techniques. The premise is simple (knock down 10 pins), but every shot triggers a chain of choreographed animations, rigid-body physics, and Doom-themed audio cues that take the game somewhere ridiculous.
It's written in C++ against Modern OpenGL 3.3 core with no engine and no fixed-function pipeline. The renderer is a two-pass forward setup: a depth-only shadow pass into a custom FBO, then a lit color pass that samples the resulting shadow map with 3×3 PCF for soft edges. Models flow in through Assimp; lighting follows the Phong model with tangent-space normal mapping and a specular mask; and a small custom animation framework drives everything from pin tilts to the Devil ball's Bezier-curve entrance.
Under the Hood
- Phong reflection model. Ambient + diffuse + specular per-fragment lighting from a directional light, with material parameters packed into a single uniform.
- Shadow mapping. Two-pass forward renderer: a depth-only pass into a custom FBO with color writes disabled, then a lit pass that samples the resulting 2048² depth texture.
- Soft shadows. 3×3 percentage-closer filtering with slope-scaled depth bias to kill acne, and an orthographic frustum tightened to the alley to maximize texel density.
- Tangent-space normal mapping. Per-vertex tangent and bitangent attributes assembled into a TBN matrix in the vertex shader using the inverse-transpose normal matrix.
- Specular masking. Per-fragment
k_smodulated by a dedicated spec map so metallic and matte regions of a texture respond differently. - Skybox. Hellish dome rendered around the scene.
- Custom animation framework. Composable clips (translation, rotation, move-to, delay, cubic Bezier curves, and sinusoidal bounce) chained per object to drive cinematics.
- Hierarchical scene graph. Object3D parent/child transforms so the Devil ball's tail follows the body automatically.
- Rigid-body-style physics. Force accumulation with gravity, drag, mass, and rotational acceleration; knocked-down pins fly off under real forces, not animation.
- Aim-based picking. Dot-product angle test against world-space pin positions to detect what the camera is looking at when you click.
- Billboarded HUD. Doom UI plane repositioned and yaw-aligned to the camera every mouse-move event.