A complete 3D software rendering engine built in pure C++ with no graphics API — implementing the entire pipeline from triangle rasterization to shadow mapping entirely from first principles.
This project was born from a desire to truly understand how game engines render 3D graphics — not just use them, but understand every calculation that turns a 3D mesh into pixels on a screen. By building a renderer from scratch in C++ with no graphics API, every stage of the pipeline had to be implemented manually.
The result is a working software renderer capable of displaying textured 3D game models with advanced lighting effects — all computed on the CPU without GPU acceleration. This kind of foundational work builds an understanding of graphics that makes working with any engine or API significantly more effective.
Triangle RasterizationImplemented the core algorithm for converting 3D triangles into 2D pixel coverage — the fundamental operation that every real-time renderer performs billions of times per second. Required careful handling of edge cases including sub-pixel precision and fill conventions.
Z-Buffering (Depth Testing)Built a depth buffer to correctly handle overlapping geometry — tracking the closest surface at each pixel so that distant geometry is correctly occluded by closer objects, without needing geometry to be sorted.
Perspective Projection & Back-Face CullingImplemented mathematically accurate perspective projection to transform 3D world coordinates to 2D screen space, and back-face culling to skip triangles facing away from the camera — a key optimization that halves the triangle count for closed meshes.
Normal MappingAdded normal map support to simulate surface detail far beyond the mesh's actual polygon count — sampling a normal map texture and perturbing the surface normal per-pixel to produce the illusion of bumps, grooves, and material texture.
Shadow MappingImplemented shadow maps — rendering the scene from the light's perspective to generate a depth map, then comparing each surface point's light-space depth to determine shadowing. One of the most technically demanding features of the project.
Debugging & Problem-SolvingMethodically diagnosed and resolved rasterizer issues including mesh bleeding artifacts, incorrect triangle winding, and precision errors — building strong debugging instincts for low-level graphics work.