From 3a97be84b4940aaa6b16488ff2420c65f13ba0c9 Mon Sep 17 00:00:00 2001 From: antopilo Date: Sun, 12 Jan 2025 11:01:47 -0500 Subject: [PATCH] Added vulkan shader manager --- .../Rendering/Vulkan/SceneRenderPipeline.cpp | 33 +++++++++++++++++-- .../Rendering/Vulkan/SceneRenderPipeline.h | 6 ++-- Nuake/src/Rendering/Vulkan/ShaderManager.cpp | 18 ++++++++++ Nuake/src/Rendering/Vulkan/ShaderManager.h | 22 +++++++++++++ .../Rendering/Vulkan/VulkanSceneRenderer.cpp | 15 +++++++-- .../Rendering/Vulkan/VulkanSceneRenderer.h | 3 +- 6 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 Nuake/src/Rendering/Vulkan/ShaderManager.cpp create mode 100644 Nuake/src/Rendering/Vulkan/ShaderManager.h diff --git a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp index ad99d782..790f5cc6 100644 --- a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp +++ b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp @@ -1,12 +1,38 @@ #include "SceneRenderPipeline.h" -#include "VkResources.h" + +#include "src/Rendering/Vulkan/ShaderManager.h" +#include "src/Rendering/Vulkan/VkResources.h" using namespace Nuake; -SceneRenderPipeline::SceneRenderPipeline(UUID camera) : - CurrentCameraID(camera) +SceneRenderPipeline::SceneRenderPipeline() { + VkShaderManager& shaderMgr = VkShaderManager::Get(); + GBufferPipeline = RenderPipeline(); + + auto& gBufferPass = GBufferPipeline.AddPass("GBuffer"); + gBufferPass.SetShaders(shaderMgr.GetShader("basic_vert"), shaderMgr.GetShader("basic_frag")); + gBufferPass.AddAttachment("Albedo", ImageFormat::RGBA8); + gBufferPass.AddAttachment("Normal", ImageFormat::RGBA8); + gBufferPass.AddAttachment("Material", ImageFormat::RGBA8); + gBufferPass.AddAttachment("Depth", ImageFormat::D32F, ImageUsage::Depth); + //gBufferPass.SetPushConstant(modelPushConstant); + + auto& shadingPass = GBufferPipeline.AddPass("Shading"); + shadingPass.SetShaders(shaderMgr.GetShader("shading_vert"), shaderMgr.GetShader("shading_frag")); + //shadingPass.SetPushConstant(shadingPushConstant); + shadingPass.AddAttachment("Output", ImageFormat::RGBA8); + shadingPass.SetDepthTest(false); + shadingPass.AddInput("Albedo"); + shadingPass.AddInput("Normal"); + shadingPass.AddInput("Depth"); + shadingPass.AddInput("Material"); +} + +void SceneRenderPipeline::SetCamera(UUID camera) +{ + CurrentCameraID = camera; } void SceneRenderPipeline::Render(PassRenderContext& ctx) @@ -24,6 +50,7 @@ void SceneRenderPipeline::Render(PassRenderContext& ctx) { ShadingOutput } // Shading }; + ctx.cameraID = CurrentCameraID; GBufferPipeline.Execute(ctx, pipelineInputs); } diff --git a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h index 0c83d11c..6752de7d 100644 --- a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h +++ b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h @@ -41,13 +41,11 @@ namespace Nuake // Holds all the texture attachments static RenderPipeline GBufferPipeline; - public: - SceneRenderPipeline(UUID camera); - - SceneRenderPipeline() = default; + SceneRenderPipeline(); ~SceneRenderPipeline() = default; + void SetCamera(UUID camera); void Render(PassRenderContext& ctx); Ref GetOutput() { return ShadingOutput; } diff --git a/Nuake/src/Rendering/Vulkan/ShaderManager.cpp b/Nuake/src/Rendering/Vulkan/ShaderManager.cpp new file mode 100644 index 00000000..1e9e465b --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/ShaderManager.cpp @@ -0,0 +1,18 @@ +#include "ShaderManager.h" + +using namespace Nuake; + +void VkShaderManager::AddShader(const std::string& shaderName, Ref shader) +{ + Shaders[shaderName] = shader; +} + +Ref VkShaderManager::GetShader(const std::string& shaderName) +{ + if (Shaders.find(shaderName) != Shaders.end()) + { + return Shaders[shaderName]; + } + + assert(false && "Shader not found by name"); +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/ShaderManager.h b/Nuake/src/Rendering/Vulkan/ShaderManager.h new file mode 100644 index 00000000..572159e0 --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/ShaderManager.h @@ -0,0 +1,22 @@ +#pragma once +#include "src/Core/Core.h" +#include "src/Rendering/Vulkan/VulkanShader.h" + +namespace Nuake +{ + class VkShaderManager + { + private: + std::map> Shaders; + + public: + static VkShaderManager& Get() + { + static VkShaderManager instance; + return instance; + }; + + void AddShader(const std::string& shaderName, Ref shader); + Ref GetShader(const std::string& shaderName); + }; +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp index 3bd05c2b..ba2fc8ae 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp @@ -19,7 +19,7 @@ #include "src/Rendering/Vulkan/DescriptorLayoutBuilder.h" #include - +#include "src/Rendering/Vulkan/ShaderManager.h" using namespace Nuake; VkSceneRenderer::VkSceneRenderer() @@ -230,8 +230,17 @@ void VkSceneRenderer::CreateBuffers() void VkSceneRenderer::LoadShaders() { + // TODO: load embedded shaders in the future + VkShaderManager& shaderMgr = VkShaderManager::Get(); ShaderCompiler& shaderCompiler = ShaderCompiler::Get(); - Shaders["basic_frag"] = shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/triangle.frag"); + shaderMgr.AddShader("basic_frag", shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/triangle.frag")); + shaderMgr.AddShader("basic_vert", shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/triangle.vert")); + shaderMgr.AddShader("shading_frag", shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/shading.frag")); + shaderMgr.AddShader("shading_vert", shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/shading.vert")); + shaderMgr.AddShader("shadow_frag", shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/shadow.frag")); + shaderMgr.AddShader("shadow_vert", shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/shadow.vert")); + + // TODO: remove this. Shaders["basic_vert"] = shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/triangle.vert"); Shaders["shading_frag"] = shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/shading.frag"); Shaders["shading_vert"] = shaderCompiler.CompileShader("../Resources/Shaders/Vulkan/shading.vert"); @@ -362,6 +371,8 @@ void VkSceneRenderer::CreateDescriptors() void VkSceneRenderer::CreatePipelines() { + sceneRenderPipeline = SceneRenderPipeline(); + ShadowPipeline = RenderPipeline(); auto& shadowPass = ShadowPipeline.AddPass("Shadow"); shadowPass.AddAttachment("Depth", ImageFormat::D32F, ImageUsage::Depth); diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h index 599ee122..d48df70b 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h @@ -12,6 +12,7 @@ #include #include #include +#include "SceneRenderPipeline.h" namespace Nuake @@ -144,7 +145,7 @@ namespace Nuake RenderPipeline GBufferPipeline; RenderPipeline ShadowPipeline; - + SceneRenderPipeline sceneRenderPipeline; public: UUID CurrentCamera; VkSceneRenderer();