Added vulkan shader manager

This commit is contained in:
antopilo
2025-01-12 11:01:47 -05:00
parent 95b0e01f0e
commit 3a97be84b4
6 changed files with 87 additions and 10 deletions

View File

@@ -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>(modelPushConstant);
auto& shadingPass = GBufferPipeline.AddPass("Shading");
shadingPass.SetShaders(shaderMgr.GetShader("shading_vert"), shaderMgr.GetShader("shading_frag"));
//shadingPass.SetPushConstant<ShadingPushConstant>(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);
}

View File

@@ -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<VulkanImage> GetOutput() { return ShadingOutput; }

View File

@@ -0,0 +1,18 @@
#include "ShaderManager.h"
using namespace Nuake;
void VkShaderManager::AddShader(const std::string& shaderName, Ref<VulkanShader> shader)
{
Shaders[shaderName] = shader;
}
Ref<VulkanShader> VkShaderManager::GetShader(const std::string& shaderName)
{
if (Shaders.find(shaderName) != Shaders.end())
{
return Shaders[shaderName];
}
assert(false && "Shader not found by name");
}

View File

@@ -0,0 +1,22 @@
#pragma once
#include "src/Core/Core.h"
#include "src/Rendering/Vulkan/VulkanShader.h"
namespace Nuake
{
class VkShaderManager
{
private:
std::map<std::string, Ref<VulkanShader>> Shaders;
public:
static VkShaderManager& Get()
{
static VkShaderManager instance;
return instance;
};
void AddShader(const std::string& shaderName, Ref<VulkanShader> shader);
Ref<VulkanShader> GetShader(const std::string& shaderName);
};
}

View File

@@ -19,7 +19,7 @@
#include "src/Rendering/Vulkan/DescriptorLayoutBuilder.h"
#include <src\Scene\Components\CameraComponent.h>
#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);

View File

@@ -12,6 +12,7 @@
#include <array>
#include <map>
#include <string>
#include "SceneRenderPipeline.h"
namespace Nuake
@@ -144,7 +145,7 @@ namespace Nuake
RenderPipeline GBufferPipeline;
RenderPipeline ShadowPipeline;
SceneRenderPipeline sceneRenderPipeline;
public:
UUID CurrentCamera;
VkSceneRenderer();