diff --git a/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp b/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp new file mode 100644 index 00000000..6280e286 --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp @@ -0,0 +1,37 @@ +#include "RenderPipeline.h" + +using namespace Nuake; + +RenderPass::RenderPass(const std::string& name) : + Name(name) +{ +} + +PassAttachment& RenderPass::AddAttachment(const std::string& name, ImageFormat format) +{ + auto newAttachment = PassAttachment(name, format); + Attachments.push_back(std::move(newAttachment)); +} + +void RenderPass::AddInput(const std::string& name) +{ + Inputs.push_back(name); +} + +RenderPipeline::RenderPipeline(const Vector2& size) : + Size(size) +{ +} + +RenderPass& RenderPipeline::AddPass(const std::string& name) +{ + auto newPass = RenderPass(name); + RenderPasses.push_back(std::move(newPass)); +} + +PassAttachment::PassAttachment(const std::string& name, ImageFormat format) : + Name(name), + Format(format) +{ +} + diff --git a/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.h b/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.h new file mode 100644 index 00000000..9f301e30 --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.h @@ -0,0 +1,54 @@ +#pragma once +#include "src/Core/Core.h" +#include "src/Core/Maths.h" + +#include "src/Rendering/Vulkan/VulkanImage/VulkanImage.h" + +#include + + +namespace Nuake +{ + class PassAttachment + { + public: + std::string Name; + ImageFormat Format; + + public: + PassAttachment(const std::string& name, ImageFormat format); + ~PassAttachment() = default; + + }; + + class RenderPass + { + private: + std::string Name; + std::vector Attachments; + std::vector Inputs; + + public: + RenderPass(const std::string& name); + ~RenderPass() = default; + + public: + PassAttachment& AddAttachment(const std::string& name, ImageFormat format); + void AddInput(const std::string& name); + }; + + class RenderPipeline + { + private: + std::vector RenderPasses; + Vector2 Size; + + public: + RenderPipeline(const Vector2& size); + ~RenderPipeline() = default; + + public: + RenderPass& AddPass(const std::string& name); + + }; +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/RenderPass.h b/Nuake/src/Rendering/Vulkan/RenderPass.h new file mode 100644 index 00000000..f32dd1d3 --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/RenderPass.h @@ -0,0 +1,90 @@ +#pragma once + +#include +#include +#include "VulkanImage/VulkanImage.h" + + +namespace Nuake +{ + // Create Pipeline + // Pipeline is a graph or pass that connects with dependencies + // Bind framebuffer or StartRendering on a Pass + // 1. Transition all images + // 2. Create render info attachment info + // 3. BeginRendering + // 3.5 Bind pipeline & descriptor sets + // 4. EndRendering + + // A render pass has inputs & outputs + + struct RenderContext + { + int cmd; + }; + + struct ImageTexture + { + std::string name; + ImageFormat format; + }; + + struct RenderPassInput + { + std::string name; + ImageFormat image; + }; + + struct RenderPassOutput + { + std::string name; + }; + + struct RenderPassInfo + { + std::string name; + std::vector attachments; + std::vector outputs; + + std::function BeginRender; + }; + + RenderPassInfo gBuffer = { + "GBuffer", + { // Output + { "albedo", ImageFormat::RGBA8 }, + { "normal", ImageFormat::RGBA8 }, + { "material", ImageFormat::RGBA8 } + }, + { // Input + { "materialAlbedo" } + }, + [](RenderContext& ctx) // On Begin + { + + } + }; + + RenderPassInfo shading = { + "Shading", + { // Output + { "output", ImageFormat::RGBA16F } + }, + { // Input + { "albedo" }, + { "normal" }, + { "material" } + } + }; + + + class RenderPass + { + public: + RenderPass(); + ~RenderPass(); + + private: + + }; +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp index 85513af3..781bd0eb 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp @@ -15,6 +15,7 @@ #include #include +#include "Pipeline/RenderPipeline.h" using namespace Nuake; @@ -40,6 +41,30 @@ void VkSceneRenderer::Init() ModelMatrixMapping.clear(); MeshMaterialMapping.clear(); + + + auto renderPipelineOpaque = RenderPipeline({1280, 720}); + + auto& gBufferPass = renderPipelineOpaque.AddPass("GBuffer"); + gBufferPass.AddAttachment("Albedo", ImageFormat::RGBA8); + gBufferPass.AddAttachment("Normal", ImageFormat::RGBA8); + gBufferPass.AddAttachment("Material", ImageFormat::RGBA8); + gBufferPass.AddAttachment("Depth", ImageFormat::D32F); + + auto& ssaoPass = renderPipelineOpaque.AddPass("SSAO"); + ssaoPass.AddInput("Normal"); + ssaoPass.AddInput("Depth"); + ssaoPass.AddAttachment("SSAO", ImageFormat::RGBA8); + + auto& shadingPass = renderPipelineOpaque.AddPass("Shading"); + shadingPass.AddInput("Albedo"); + shadingPass.AddInput("Normal"); + shadingPass.AddInput("Material"); + shadingPass.AddInput("SSAO"); + shadingPass.AddInput("Depth"); + shadingPass.AddAttachment("Output", ImageFormat::RGBA16F); + + } void VkSceneRenderer::BeginScene(RenderContext inContext) @@ -96,6 +121,19 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) //vkCmdClearDepthStencilImage(cmd, GBufferDepthImage->GetImage(), VK_IMAGE_LAYOUT_GENERAL, &clearValue2, 1, &range); + + // Create Pipeline + // Pipeline is a graph or pass that connects with dependencies + // Bind framebuffer or StartRendering on a Pass + // 1. Transition all images + // 2. Create render info attachment info + // 3. BeginRendering + // 3.5 Bind pipeline & descriptor sets + // 4. EndRendering + + // + + // End rendering VulkanUtil::TransitionImage(cmd, GBufferNormal->GetImage(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); VulkanUtil::TransitionImage(cmd, GBufferMaterial->GetImage(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); VulkanUtil::TransitionImage(cmd, GBufferAlbedo->GetImage(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); @@ -248,7 +286,7 @@ void VkSceneRenderer::EndScene() VulkanUtil::TransitionImage(cmd, GBufferNormal->GetImage(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); VulkanUtil::TransitionImage(cmd, GBufferMaterial->GetImage(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); VulkanUtil::TransitionImage(cmd, vk.DrawImage->GetImage(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - VulkanUtil::CopyImageToImage(cmd, GBufferMaterial->GetImage(), vk.GetDrawImage()->GetImage(), GBufferAlbedo->GetSize(), vk.DrawImage->GetSize()); + VulkanUtil::CopyImageToImage(cmd, GBufferNormal->GetImage(), vk.GetDrawImage()->GetImage(), GBufferAlbedo->GetSize(), vk.DrawImage->GetSize()); VulkanUtil::TransitionImage(cmd, vk.DrawImage->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL); VulkanUtil::TransitionImage(cmd, GBufferMaterial->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL); VulkanUtil::TransitionImage(cmd, GBufferNormal->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL);