1
0
Fork 0
Go to file
Austin Morlan 7e3789e640
Add GIF to README
2020-07-01 17:43:09 -07:00
include Convert hot-loop functions to be inline 2020-07-01 17:43:08 -07:00
src Convert hot-loop functions to be inline 2020-07-01 17:43:08 -07:00
LICENSE Initial commit 2020-07-01 17:42:42 -07:00
Makefile Convert hot-loop functions to be inline 2020-07-01 17:43:08 -07:00
README.md Add GIF to README 2020-07-01 17:43:09 -07:00

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.

Demo