DirectX 12 Renderer

Table of Contents

Overview

The purpose of this project was to implement a new, modern, more maintainable, and more scalable renderer from scratch using DirectX 12. The goal was to create a well-threaded renderer that utilizes a render graph architecture, incorporates an automatic streaming system, and delivers high performance. Additionally, the renderer was designed to employ clustered forward rendering techniques and an updated Disney BSDF PBR model.

The decision to choose DirectX 12, one of the more advanced graphics APIs, was driven by the desire to leverage specific features such as dynamic indexing and unbound arrays. These features were notably absent in DirectX 11 and only partially supported in OpenGL through the ARB_bindless_texture extension. Having previous experience with implementing a Vulkan renderer, I decided to explore and gain expertise with DirectX 12 for this project.

Results

The basic design I ended up with was this. My main goal was to keep the "public" interfaces used by the rest of the engine/game simple and concise. I also followed the HLR-LLR renderer design pattern as I've had good experiences with it previously. The jist of the design partern is that you have a LLR which is a light-weight abstraction layer ontop of a rendering API(DirectX 12 in this case) and a HLR which then uses that LLR to implement more higher level things.