render pipeline stuff

This commit is contained in:
antopilo
2025-01-05 01:53:26 -05:00
parent 3d5ad2e131
commit 0dfa62988b
4 changed files with 220 additions and 1 deletions

View File

@@ -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)
{
}

View File

@@ -0,0 +1,54 @@
#pragma once
#include "src/Core/Core.h"
#include "src/Core/Maths.h"
#include "src/Rendering/Vulkan/VulkanImage/VulkanImage.h"
#include <vector>
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<PassAttachment> Attachments;
std::vector<std::string> 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<RenderPass> RenderPasses;
Vector2 Size;
public:
RenderPipeline(const Vector2& size);
~RenderPipeline() = default;
public:
RenderPass& AddPass(const std::string& name);
};
}

View File

@@ -0,0 +1,90 @@
#pragma once
#include <string>
#include <vector>
#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<RenderPassInput> attachments;
std::vector<RenderPassOutput> outputs;
std::function<void(RenderContext& ctx)> 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:
};
}

View File

@@ -15,6 +15,7 @@
#include <Tracy.hpp>
#include <src/Scene/Components/ModelComponent.h>
#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);