menu

Doomenstein

Introduction

Doomenstein started off as a retro-style 3D first-person shooter with 8-facing sprites, supporting local multiplayer with keyboard+mouse and XBox controllers with up to 4 players. Later, I added 3D model loading from OBJ files, procedurally generating a world featuring rocks and trees and 3 waves of enemies that the player must clear to win the game. The game also included shadow maps using DirectX11's programmable graphics pipeline, using a depth buffer and two rendering passes to generate the world from the light's perspective and use the depth buffer to generate shadows

Duration: Jan 2024 - May 2024

Technologies: Rey Engine (Custom C++ Game Engine)

Role: Sole Developer

Key Features

  • Billboarded 8-facing sprites with animations for walking, attack, taking damage and dying.
  • Billboarded sprite particles for blood splatter effects, plasma gun projectile firing and more.
  • Local multiplayer with keyboard+mouse and controllers, supporting up to 4 players.
  • 3D model loading from OBJ files, supporting diffuse colors from MTL files and textures on models.
  • 3 weapons (pistol, rifle and grenade launcher), 3 enemy types (melee soldier, ranged soldier, tank) and 3 waves.
  • 3D cube particles for visual effects on firing guns, grenade explosions and blood splatter.
  • Directional lighting with shadow maps generated using a depth buffer and two rendering passes.
  • VR support using OpenXR.

8-Facing Billboarded Sprites

  • The initial project involved 8-facing billboarded sprites with animations for enemies.
  • I created an AnimationGroupDefinition class with a list of sprite animations (SpriteAnimDefinition).
  • The AnimationGroupDefinition class could be queried for the animation that gave the largest dot product with a given vector (camera direction).

				

Shadow Maps

  • I implemented dynamic shadow maps for 3D objects using a separate shadow-rendering pass from the light's point-of-view.
  • Wrote a separate shader for creating a shadow map using a separate depth stencil view.
  • During the render pass, the shadow DSV is sampled to determine the color in the pixel shader.