Austin Morlan aee55ce4ae | ||
---|---|---|
include | ||
src | ||
LICENSE | ||
Makefile | ||
README.md |
README.md
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.