The Devil Bowling Ball delivering a Hellstrike on a row of bowling pins
Graphics · C++ · Modern OpenGL 3.3

Doom
Bowling

A Hell-themed bowling mini-game built from scratch in C++ and Modern OpenGL, inspired by the original DOOM (1993) and wacky bowling-alley cinematics. Knock down all 10 pins to summon the Devil Bowling Ball.

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_s modulated 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.