Cat Game Research
Frontier
Dev-log transmissions from the expedition

Why Vulkan: Choosing the Hard Path

The decision to build a custom Vulkan renderer from scratch instead of using OpenGL, WebGPU, or an existing engine — and what that choice cost us.

The Crossroads

Every game engine project reaches a crossroads early on: what graphics API to use. The options in 2024 were clear — OpenGL (comfortable, well-documented, slow to evolve), WebGPU (promising but still maturing), or Vulkan (powerful, explicit, notoriously difficult to learn).

We chose Vulkan. This is the story of why, and what it cost.

The Case Against Comfort

OpenGL would have been the comfortable path. Every tutorial, every Stack Overflow answer, every textbook points toward OpenGL. We could have had a triangle on screen in an afternoon. A textured quad by day two. A full deferred renderer within a week.

But comfort is not the goal. The goal is understanding — deep, structural understanding of how the GPU actually works. OpenGL hides that. Its state machine model, while convenient, abstracts away the very things that matter: memory layout, synchronization, command buffering, pipeline state.

The best way to understand a system is to build it at the lowest level you can tolerate. For graphics, that's Vulkan.

The Cost

The first triangle took three weeks. Not because Vulkan is inherently difficult — it's verbose, not complex — but because every concept had to be understood before it could be used. You can't fake your way through a Vulkan initialization sequence. You either understand swapchains or you don't have a window.

The learning curve looked like this:

The Payoff

By month three, the investment started paying dividends. When we needed to implement a deferred PBR pipeline, the explicit memory model made it straightforward — we understood exactly where each buffer lived, how it was aligned, and when it was accessible. There were no hidden state transitions to debug, no "why is this black?" mysteries.

The render graph architecture that emerged from this understanding is something we couldn't have built on OpenGL. Bindless textures, explicit barrier placement, and multi-queue submission aren't optional features in Vulkan — they're the default way you think about the GPU.

Would We Do It Again?

Yes. Without hesitation. The three weeks of "no rendering" were the most productive three weeks of the project, because they built the foundation that everything else stands on. Every subsequent feature — VFX, side-scroll gameplay, Go RL training — was easier because the rendering layer was solid and understood.

If you're starting a custom engine today and you're serious about understanding graphics, choose Vulkan. Accept the cost. It's worth it.

← All transmissions