I want to build a Renderer from scratch using Vulkan. I just finished a course on Udemy that gave me a quick rundown of what Vulkan has to offer. But there is still a lot to learn for me (which is exciting!). Listed below are a couple of tasks that I would like to do with the Vulkan Renderer I plan on writing.
For all of these tasks, implementing is not enough for me. I want to be able to say with confidence that I understand the concepts as well as the math behind each of these concepts.
I made this Renderer while working alongside the lecturer of the course I was taking. This means that although I have a good grasp on how Vulkan works overall. The nitty gritty of the API itself is still somewhat a blur for me. I think rewriting the Renderer without any hand holding will solidify my understanding of how to use the Vulkan API.
Implement basic camera controls, like orbiting around a point, panning, zooming, and rotation. Also, develop a system for object transformations like translation, rotation, and scaling.
Implement basic shading models like Phong or Lambert. I'll also need to incorporate some basic lighting models, starting with a simple directional light.
Use a library like Assimp to load complex 3D models from a variety of file formats. At this stage, focus on rendering these models with a simple, uniform color.
Add texture support for your models. This includes both single textures (diffuse) and multiple textures (specular, normal, etc.).
Implement a more efficient lighting model. Will need to modify my shaders and rendering pipeline to accommodate a two-pass approach.
Improve the lighting model to support point lights, spotlights, and multiple lights. Try to implement more advanced lighting techniques like Normal Mapping, Parallax Mapping, HDR, Bloom, and so on.
Implement basic shadow mapping, which involves rendering the scene from the perspective of a light source and then using that information to create shadows.
Learn how to implement post-processing effects, like bloom, depth of field, or screen-space ambient occlusion (SSAO). This will drastically improve the look of the renders.
Add support for basic animations. This will probably involve skeletal animation, and can also involve things like vertex shaders for more dynamic, procedural animations.
Implement physically-based rendering (PBR) materials. This is a more modern approach to rendering, which provides a more realistic and consistent look under various lighting conditions.
Implement a scene graph to handle hierarchical or parent-child relationships between objects. This is essential for complex scenes and is also useful for culling and level-of-detail techniques.
Finally, work on optimizing the renderer. This can involve techniques like frustum culling, occlusion culling, and level-of-detail rendering. Look into multi-threaded rendering and GPU instancing.
Texture Demonstration!
2023-08-22.22-37-33.mp4
Depth Buffer + Dynamic Uniform Buffer Demo!