mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-15 20:08:54 +03:00
render pipeline stuff
This commit is contained in:
37
Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp
Normal file
37
Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp
Normal 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)
|
||||
{
|
||||
}
|
||||
|
||||
54
Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.h
Normal file
54
Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.h
Normal 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);
|
||||
|
||||
};
|
||||
}
|
||||
90
Nuake/src/Rendering/Vulkan/RenderPass.h
Normal file
90
Nuake/src/Rendering/Vulkan/RenderPass.h
Normal 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:
|
||||
|
||||
};
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user