PicoGine3
This new project is the continuation of my previous work on PicoGine. In this new version, I will focus more on graphics and rendering, rather than a broader engine, since this is the domain I want to specialize into. Therefore, I will rely on more libraries to build the core of the engine, such as a entity-component system like Flecs for example.
The main goal is to incrementally add new rendering features using both Vulkan and DirectX 12 under a common abstraction.
To make the shader compilation easier, I made another project called PicoGineSC. More info on its project page.
The project is available on GitHub! Link below.
This project is still work in progress at an early stage.
Planned features list
[✓] Visual Leak Detector
[✓] Win32 for window and system events
[✓] Vulkan renderer
[✓] Keyboard and mouse control with raw input
[✓] Controller support
Graphics abstraction layer
DirectX12 renderer
PBR Materials
Advanced graphics techniques (i.e. batching, instancing, multi-threaded command recording, async compute, ...)
GPU particles
Specific rendering systems for terrain, grass, foliage, ...
Volumetric effects
Various Post-Processing effects (tonemapping, bloom, depth of field, ...)
Anti-aliasing solutions (MSAA, TAA, FXAA)
Upscalers (DLSS, FSR, XeSS)
Raytracing/Pathtracing (for things like G.I., shadows, ...)
Entity-Component system
ImGUI for simple editor
FMod for audio
And many more to come in the future...
Covered topics (so far)
Win32
Raw input devices
Vulkan
HLSL
DirectX Math
Xinput
Assimp (Open Asset Import Library)
stb-image
Flecs Entity-Component System (W.I.P)
Various programming patterns (i.e. game loop, singletons, ...)
Reference materials
Mastering Graphics Programming with Vulkan, M. Castorina, G. Sassone
GPU Zen 1: Advanced Rendering Techniques, W. Engel
GPU Zen 2: Advanced Rendering Techniques, W. Engel
GPU Zen 3: Advanced Rendering Techniques, W. Engel
Graphics Programming Conference 2024, Breda, The Netherlands (attended in person)
Win32, window, and inputs
Initially, I was planning to use the SDL library to create the window as well as handle inputs. Because I will not use other features from SDL, I decided to still implement it myself using Win32 since I've done it multiple times already and might be even faster than implementing SDL.
The window supports resizing, minimizing, maximizing, and toggling full screen borderless mode. It also supports multiple monitors, and can move the window across screens with the Windows shortcuts (Win + Shift + Arrows) even in full screen borderless mode.
For the inputs, I used raw input devices for the mouse and keyboard to try something new. I also added controller support using the Xinput library.
Vulkan and DirectX 12
The project will support both Vulkan and DirectX 12. I made separate build targets which both have a preprocessor define for their specific API. This allows me to batch build all targets to ensure the changes made with one API don't beak the other.
At the moment, only a basic Vulkan implementation is available, which was made following the vulkan-tutorial.com, similarly to my previous Vulkan Renderer project except this time I used HLSL for the shaders instead of GLSL. The next step is to cleanup and restructure the code properly, then start working on abstracting all the key elements. Then, I'll make a similar DirectX 12 implementation following this 3dgep: Learning DirectX 12 guide.
Once the barebone core of both API works under the same abstraction, I will start implementing more advanced topics, most likely in Vulkan first because I have more reference material for that API.