A feature-complete Minecraft-style 3D world engine built from scratch in C++ and OpenGL — 7 procedural biomes via layered Perlin/FBM noise, 3D cave systems, PCF shadow mapping, screen-space reflections, vertex ambient occlusion, a day-night cycle, multithreaded chunk streaming, and a predator-prey NPC ecosystem with A* pathfinding on a thread pool.
Mini Minecraft is a semester-long group project for CIS 4600 (GPU Programming) at Penn. The goal was to build a faithful recreation of Minecraft's core engine — procedural world generation, real-time rendering, player physics, and interactive terrain — using only C++17, OpenGL 3.3, and GLSL with no game engine or rendering framework. The final codebase spans 26 C++ source files and 13 GLSL shaders.
The project ran across three milestones, with each of three teammates owning distinct systems per milestone. My contributions spanned 7-biome procedural terrain generation, 3D cave systems with post-process fluid overlays, and a full render pipeline upgrade: PCF shadow mapping, screen-space reflections, vertex ambient occlusion, distance fog, Blinn-Phong specular highlights, and a day-night cycle.
My first milestone was procedural terrain generation. The world supports 6 distinct biomes blended seamlessly using large-scale noise.
Grassland biome — Voronoi hills, sandy coastline, distance fog
Biome blending — stone mountain meets grassland via smoothstep interpolation
Water generation — empty columns between Y=128–138 fill as lakes
Screen-space reflections — terrain and sky reflected on water surface via view-space ray marching
The second milestone added underground depth to the world and a full post-process rendering pipeline.
3D Perlin caves — blocks below Y=128 carved by negative noise; lava fills below Y=25
The final milestone was a full upgrade to the rendering pipeline, pushing visual quality significantly beyond the base engine.
Render pipeline — shadow mapping, Blinn-Phong specular, distance fog, and sun bloom post-process
Beyond my own systems, the project's full feature set was built collaboratively:
Working at the level of raw OpenGL — managing your own framebuffers, writing every shader, coordinating GPU state by hand — forces an understanding of the rendering pipeline that abstracted engines hide. Debugging shadow acne required understanding why floating-point depth comparisons fail at grazing angles. Getting SSR to not flicker required understanding how screen-space ray marching degrades at the edges of the view frustum.
The multithreading constraint was equally instructive. Any time a VBOWorker tries to call OpenGL on a non-main thread, the context is invalid and the call silently fails or crashes. Designing the pipeline around that constraint — workers compute data, main thread uploads — made the architecture cleaner than a naive approach would have been.
Most importantly, the project made abstract concepts from class concrete: noise functions that looked like math on slides produced actual mountains; the shadow map depth texture, once visualized, made the algorithm immediately legible. Building the whole stack yourself, even at high cost, produces a level of understanding that using a game engine simply cannot.