Kreg’s Toolbox

For our third year project our team worked on a game creation tool, a mix between Scratch and Garry’s Mod with a doodle-esc artstyle.

This project uses a custom game engine made in C++ using Vulkan as it’s rendering API.

On this project I was primarily in charge of the renderer.


Vulkan Backend

I decided to target Vulkan 1.2 as our baseline to ensure the game runs on low end PC hardware, while still supporting many modern features.

This includes vk_ext_descriptor_indexing, which was used as the basis for our bindless texturing system.


Render Graph

A significant challenge in modern rendering (especially in Vulkan) is synchronization.

At first we tried hard-coding barriers between the various render passes we needed.

This did not scale however. Our final rendering pipeline included 13 render passes, each with their own web of dependencies. We decided to implement a render graph, which could automatically place barriers at the most efficient positions simply by specifying a pass’s inputs, outputs, and dependencies, as shown here:


Stylized Rendering

For Kreg’s Toolbox, we wanted the game to give off a playful vibe, and we thought stylized ink outlines around objects would give the feel we wanted.

Our outline rendering algorithm combines the inverse hull method, hand modeled outline geometry, and post processing in order to create outlines that feel hand-drawn while staying within a strict performance budget.

We combined these stylized outlines with realistic shadow rendering and post processing to further add detail to our scenes.