Diabotical Rogue

I joined The GD Studio as a Game Programming Intern from August 2023 to April 2024. Since April 2024, I’ve continued at the studio as a full-time developer.

  • Online first-person shooter released on Steam and Epic Games Store.
  • Created by The GD Studio with around 40 people.
  • The game has a level editor that the community can use to create their own maps.
My contributions:
  • DirectX12 port from DirectX11 (in progress)
  • Custom game engine development in C++.
  • Level editor improvements, bug fixes and new tools for the mappers.
  • Rendering performance optimizations.
DirectX12 port:

Porting the our own engine, Glitch, to DirectX12 has been the most fun I’ve had so far at The GD Studio. The task is still in progress, with about 80% of the rendering code successfully transitioned from DirectX11 to DirectX12. I’ve always found rendering programming fascinating, though it was a bit challenging to pick up initially. This porting process has given me a much deeper understanding of graphics programming, especially around performance and effective memory management. Now that I’ve gotten hands-on experience with DirectX12, I feel much more confident, and I’m sure picking up other graphics APIs in the future will be significantly easier.

Level editor:

The level editor allows the level designers to place and arrange objects to create visually compelling and gameplay-rich maps. I worked closely with the level design team, fixing bugs, iterating on feedback, and implementing new features based on their needs.

One tool I’m particularly proud of is the visibility volume tool. It allows level designers to place custom volumes in the map for occlusion culling. The process starts with creating and connecting 2D planes, which are then extruded into 3D volumes. These volumes are used at runtime to optimize rendering by culling objects outside the player's line of sight.

Occlusion culling:

One of my tasks on Diabotical Rogue was optimizing rendering performance. The engine already had frustum and occlusion culling to skip objects outside the camera’s view, but that wasn’t enough. Many objects were still being rendered even when fully hidden behind others. To solve this, I implemented a new occlusion culling system for static geometry. Mappers placed visibility volumes and bake points in the level, which acted like virtual cameras during baking. The system then used DirectX occlusion queries to figure out what objects were visible from each point. At runtime, the engine checks which volume the player is in and only renders objects marked as visible from that area, no need for real-time occlusion checks. This gave us a big performance boost, especially in detailed levels.

Here’s a video showing it in action: the left shows normal rendering, while the right highlights what gets culled. Everything visible on the right is actually skipped in game, saving tons of draw calls.

Triangle remover:

I noticed that many triangles in our levels were never visible from any angle, especially in areas like the mountains, which were built from intersecting rock meshes. Since the intersection triangles were completely hidden, we could safely remove them. I developed a triangle remover that scans for visible triangles while we bake the occlusion culling. During the baking process, each triangle is assigned a unique ID. All visible triangles draw their ID to a render target texture. At the end of the frame, we read every pixel of that texture to determine which triangles are visible. Any triangle that remains hidden throughout the baking process is removed.

For example on the "Wellspring" map this optimization alone removed 55% of the triangles:

Before triangle remover

After triangle remover