The Plain Renderer is a C++ Vulkan renderer I wrote to learn about lower level APIs and their more advanced features, such as multithreaded command recording and explicit CPU/GPU synchronization.
Additionally my goal was to build a framework that avoided as much boilerplate code as possible, so that I could focus on implementing rendering techniques without being bogged down by tedious details, like image layout transitions or memory barriers.

Sponza Screenshot
The classic Sponza scene rendered in Plain

In terms of visuals my goal was to achieve natural looking results.
To achieve this I decided to go for a physically based approach. Not only using the corresponging BRDF models, but also using physical light units, exposure values with the proper equations for the camera and following physically motivated techniques for volumetric and sky rendering.

The project can be found on GitHub.


Profiling and UI
Profiling statistics and render settings UI

Feature list

  • Real time diffuse GI, by tracing SDF representation of scene and denoising
  • Cook-Torrance BRDF using GGX-distribution, correlated smith geometry term and multiscattering
  • Temporal Anti Aliasing using an exponential history buffer and bicubic sampling
  • Physically based sky rendering with multiscattering approximation
  • Physically based light and camera units and histogram based automatic exposure
  • Volumetric lighting using froxels
  • Bloom and tonemapping
  • Single pass min/max hierarchical depth buffer generation
  • Cascaded shadow maps for the sun, tightly fitted to depth buffer
  • Blue noise generation using the void and cluster method
  • 3D perlin noise generation
  • Simple job system for multithreading, used for accelerating SDF generation, texture loading and multithreaded drawcall recording
  • Custom Vulkan memory allocator
  • Separate asset pipeline producing mesh data in a binary format for efficient loading and SDF generation
  • Shader hot reloading
Indiret lighting
Dynamic indirect lighting
Sky
Sky rendering using earth's atmosphere values