VEngine (Vulkan/D3D12 Hobby Render Engine)
Wanting to familiarize myself with Vulkan, I wrote another hobby render engine from scratch. The learning curve was fairly steep, but eventually I came out on top. The first thing I implemented was a render graph/frame graph so that I would no longer have to manually synchronize access to GPU resources. The way it works is that one can register resources and passes using those resources in a reading or writing manner. The render graph then figures out the required synchronization (even supporting multiple queues aka async compute), creates temporary resources, records command buffers and submits them to the GPU.
Later, I implemented an abstraction layer over both Vulkan and D3D12 so that the same rendering code and the same shaders could be used with both APIs. Creating this abstraction layer was very insightful to me and tought me a lot about D3D12.
Apart from these more interesting points, the renderer also features the following:
- Physically Based Rendering
- Dynamically updated parallax corrected cubemaps for reflections (Image Based Lighting). The cubemaps are rendered once into a g-buffer and then relit on demand.
- Temporal Anti-Aliasing. This one was a major step up in quality compared to FXAA/SMAA in my old hobby engine :)
- Shadowed point-, spot- and directional lights. Point- and spot lights share a shadow atlas.
- Bloom
- Particles
- And as part of my masters thesis: Volumetric Lighting with volumetric shadows for both volume and particle based participating media.
The ‘V’ in ‘VEngine’ stands for Vulkan. Naming things is one of the hardest problems in programming.