Awesome
Software Renderer
<img src="assets/helmet/screenshot2.png" width="410"> <img src="assets/helmet/screenshot3.png" width="410"> <img src="assets/drone/screenshot1.gif" width="410"> <img src="assets/drone/screenshot2.gif" width="410">
This is a shader-based software renderer written from scratch in C89 with minimal dependencies, available for Windows, macOS, and Linux.
Features
- Cross platform
- Minimal dependencies
- Shader based
- Homogeneous clipping
- Back-face culling
- Perspective correct interpolation
- Depth testing
- Alpha testing
- Alpha blending
- Cubemapped skybox
- Skeletal animation
- Tangent space normal mapping
- Shadow mapping
- ACES tone mapping
- Blinn–Phong reflection model
- Physically based rendering (PBR)
- Metallic-roughness workflow
- Specular-glossiness workflow
- Image-based lighting (IBL)
- Orbital camera controls
- PBR material inspector
Download
Pre-built binaries for Windows, macOS, and Linux are available for download from the Releases page.
Build
To build the software renderer from source, a C89 compiler and development files for your window system are required.
Windows
Install Visual Studio
with C++ support and run build_win32.bat
.
macOS
Install Command Line Tools for Xcode with the command below and
run build_macos.sh
.
xcode-select --install
Linux
Install GCC and Xlib with the following commands and run build_linux.sh
.
Ubuntu / Debian
sudo apt install gcc libx11-dev
Fedora / RHEL
sudo dnf install gcc libX11-devel
openSUSE / SUSE
sudo zypper install gcc libX11-devel
Bonus
A CMakeLists.txt
file is provided for generating project files using
CMake (see examples below).
Visual Studio
mkdir build
cd build
cmake -G "Visual Studio 16 2019" ..
start Renderer.sln
Xcode
mkdir build
cd build
cmake -G Xcode ..
open Renderer.xcodeproj
Makefile
mkdir build
cd build
cmake -G "Unix Makefiles" -D CMAKE_BUILD_TYPE=Release ..
make
Usage
Launch
If the software renderer is launched without arguments, one of the available scenes will be chosen randomly. To display a specific scene (see below), additional arguments should be supplied. The command line syntax is:
Viewer [test_name [scene_name]]
Controls
- Orbit: left mouse button
- Pan: right mouse button
- Zoom: mouse wheel
- Rotate lighting: <kbd>A</kbd> <kbd>D</kbd> <kbd>S</kbd> <kbd>W</kbd>
- Reset everything: <kbd>Space</kbd>
Inspector
For PBR scenes, a material inspector that is very similar to the layers view of Marmoset Viewer is provided. Double click to bring it up.
Screenshots
References
Rendering pipeline
Physically based rendering
File formats
Miscellaneous
- Homogeneous clipping
- Barycentric coordinates
- Perspective correct interpolation
- Skeletal animation
- Tangent space normal mapping
- Ambient occlusion
- ACES tone mapping
- Orbital camera controls
- Xlib programming guide
- Type-safe dynamic array