For the Vulkan engine, we use a specific folder layout.
/assetswill contain textures and 3d models that we use over the guide
/binis where the executables will get built. We don’t use the normal CMake build folders to simplify the paths to assets and shaders
/shaderswill contain all our shaders, and their compiled output
/chapter-Nfolders contain the code for each of the chapters of the guide
/third_partycontains all of the libraries we use, vendored in, so all of the source code is readily available
On the engine, we use a set of libraries, most stored in
/third_party. The only library that isn’t vendored-in is SDL
All the libraries in third-party are vendored-in, and CMake will build them automatically. For SDL, it’s required to build it separately from the project, and tell CMake where to find it.
The Libraries we are using:
GLM (openGL Mathematics) Mathematics library, Header only. We use this for its matrix and vector math functionality. It’s a library that contains types that are directly compatible with GLSL types in most cases. For example, a
glm::mat4has similar operations and is directly compatible with a
mat4in a shader. While it says OpenGL in the name, it works great with Vulkan.
SDL Windowing and input library, Separately built. SDL is one of the most used libraries to create a window and access input devices in a crossplatform way. SDL works on almost every platform, and is very well supported. Used in Unreal Engine, Unity, Source, and others. We use it in the project to have a easy and fast way to open a window, and have detailed keyboard input.
dear IMGUI Easy to use immediate Graphical-User-Interface (GUI) library. This allows us to create editable widgets such as sliders and windows for the user interface. It’s widely used in the game industry for debug tools. In the project, we use it to create interactive options for rendering.
STB Image Image loading library, header only. Small and easy to use library to load image files. It can load common image formats such as BMP, PNG, JPEG, and others. It is part of a set of other similar single-file libraries.
Tiny Obj Loader .Obj model loader library, header only. Fast and small library to load the .obj 3d model format that we will use when loading 3d models.
Vk Bootstrap Abstracts a big amount of boilerplate that Vulkan has when setting up. Most of that code is written once and never touched again, so we will skip most of it using this library. This library simplifies instance creation, swapchain creation, and extension loading. It will be removed from the project eventually in an optional chapter that explains how to initialize that Vulkan boilerplate the “manual” way.
VMA (vulkan memory allocator) Implements memory allocators for Vulkan, header only. In Vulkan, the user has to deal with the memory allocation of buffers, images, and other resources on their own. This can be very difficult to get right in a performant and safe way. Vulkan Memory Allocator does it for us and allows us to simplify the creation of images and other resources. Widely used in personal Vulkan engines or smaller scale projects like emulators. Very high end projects like Unreal Engine or AAA engines write their own memory allocators.
Next: Building Project