# Software 3D Renderer ## Features * OBJ model import * Depth buffering * Texture mapping with bilinear filtering * Lighting (ambient, diffuse, specular) * Smooth shading ## Goals ### Implement basic GPU pipeline in software To best learn what a GPU is doing, I wanted to recreate the functionality of the GPU in software. It's not anywhere near as fast as a GPU of course, but it's not slow either (for a single model that is relatively low-poly). ### Simple code Coming from a C background, I wanted to use features of C++ that I found made the code cleaner and easier to understand while avoiding many of the fancier ones that seemed unnecessary. Primarily I leveraged operator overloading for vector and matrix operations, and used some simple classes with constructors. ### Good cache performance The biggest bottleneck of modern CPU performance is latency between memory and the CPU, so I tried to use spatial and temporal locality to keep data in the cache. Although I chose to go for array-of-structs instead of struct-of-arrays, the cache miss rate is fairly low. ### Minimal libraries I created my own *very* basic OBJ loader (rather than use `tinyobj`) to better understand how OBJ files are constructed, along with their respective MTL files. I also wrote my own linear algebra functions and classes (rather than use `glm`) to better understand the low-level math operations.