2018-10-05 01:45:29 +00:00
|
|
|
# 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).
|
|
|
|
|
|
|
|
### 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.
|
2018-09-05 01:24:59 +00:00
|
|
|
|
2019-08-14 23:28:26 +00:00
|
|
|

|
2019-08-06 21:36:03 +00:00
|
|
|
|