Kartoshka Engine

A 3D Vulkan renderer developed as a side project

Project summary

Team:

Solo project

Role in team:

Primarily focused on programming Vulkan as well as slight engine features.

Development cycle:

~200 hours of work over the course of 4 months

Contributions:

Vulkan framework and shaders for Blinn-Phong rendering pipeline

Normal mapping and lighting via point lights

Omnidirectional shadow mapping for a single point light in the scene

Sponza as rendered in Kartoshka Engine

About the project

Kartoshka Engine is a Vulkan renderer that I have worked on in the 2nd and 3rd year of my study in Breda University of Applied Sciences in order to learn about the API and to better understand some rendering techniques. A total of around 200 hours were put into the project, including the research into Vulkan to understand the implementation details. The project was developed from scratch in that time, only utilizing a handful of libraries to allow me to focus on working with Vulkan. The most notable of those libraries were Dear ImGui for immediate mode graphical UI, stb-image for texture loading, and fx-gltf for easier loading of GLTF files.

The initial goal of the project was to learn the API by loading and rendering out Sponza in it, but I continued using it as a sandbox in which I can prototype rendering techniques in order to better understand them and their implementation. Because of that, in its current state the project has the following features:

  • Model loading via GLTF files;
  • Blinn-Phong rendering model using normal maps and point lights;
  • Omnidirectional shadow mapping;

The features in detail

Most of the work put into the project was to develop a framework to simplify the usage of Vulkan for myself, which in made it necessary to develop a solid understanding of many concepts in Vulkan, such as the synchronization and memory management which are significantly different to DirectX 12, which I was already well accustomed to at the time. Later on I also added the lighting using point lights and the normal mapping for surfaces. The omnidirectional shadow mapping was implemented months later as a means to practice my understanding of linear algebra and matrix math due to the list of transformations that need to be done when building and then sampling the shadow maps.

The development of this renderer has been instrumental to my understanding of Vulkan. The code of the project can be found on GitHub, although as it has been entirely a free-time project I have not put considerable effort into maintaining the code quality throughout the codebase.