Software 3D renderer using only the CPU. Features OBJ model import, depth buffering, texture mapping with bilinear filtering, lighting (ambient, diffuse, specular), and smooth shading.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Austin Morlan b1d206c372
2 months ago
Source Code cleanup 4 months ago
CMakeLists.txt Code cleanup 4 months ago
LICENSE Initial commit 8 months ago Fix GIF in README 2 months ago

Software 3D Renderer


  • OBJ model import
  • Depth buffering
  • Texture mapping with bilinear filtering
  • Lighting (ambient, diffuse, specular)
  • Smooth shading


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).

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.