From 1340d717990714feec07e029318ff0f1bc4a4627 Mon Sep 17 00:00:00 2001 From: antopilo Date: Sun, 12 Jan 2025 21:46:19 -0500 Subject: [PATCH] Refactoring --- .../Rendering/Vulkan/SceneRenderPipeline.cpp | 54 ++++++++++++++++--- Nuake/src/Rendering/Vulkan/VkMesh.cpp | 2 +- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp index f7d24663..f3b04563 100644 --- a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp +++ b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp @@ -2,22 +2,29 @@ #include "src/Rendering/Vulkan/VkShaderManager.h" #include "src/Rendering/Vulkan/VkResources.h" + +#include "src/Scene/Scene.h" +#include "src/Scene/Entities/Entity.h" +#include "src/Scene/Components/TransformComponent.h" +#include "src/Scene/Components/ModelComponent.h" + +#include "src/Rendering/Textures/Material.h" + #include + using namespace Nuake; RenderPipeline SceneRenderPipeline::GBufferPipeline; - - SceneRenderPipeline::SceneRenderPipeline() { // Initialize render targets const Vector2 defaultSize = { 1280, 720 }; GBufferAlbedo = std::make_shared(ImageFormat::RGBA16F, defaultSize); - GBufferDepth = std::make_shared(ImageFormat::D32F, defaultSize, ImageUsage::Depth); GBufferNormal = std::make_shared(ImageFormat::RGBA16F, defaultSize); GBufferMaterial = std::make_shared(ImageFormat::RGBA8, defaultSize); + GBufferDepth = std::make_shared(ImageFormat::D32F, defaultSize, ImageUsage::Depth); ShadingOutput = std::make_shared(ImageFormat::RGBA8, defaultSize); // Initialize pipeline @@ -26,10 +33,10 @@ SceneRenderPipeline::SceneRenderPipeline() 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.AddAttachment("Albedo", GBufferAlbedo->GetFormat()); + gBufferPass.AddAttachment("Normal", GBufferNormal->GetFormat()); + gBufferPass.AddAttachment("Material", GBufferMaterial->GetFormat()); + gBufferPass.AddAttachment("Depth", GBufferDepth->GetFormat(), ImageUsage::Depth); gBufferPass.SetPushConstant(gbufferConstant); gBufferPass.SetPreRender([&](PassRenderContext& ctx) { auto& layout = ctx.renderPass->PipelineLayout; @@ -42,7 +49,38 @@ SceneRenderPipeline::SceneRenderPipeline() ctx.commandBuffer.BindDescriptorSet(layout, gpu.CamerasDescriptor, 6); }); gBufferPass.SetRender([&](PassRenderContext& ctx) { - + auto& cmd = ctx.commandBuffer; + auto& scene = ctx.scene; + auto& vk = VkRenderer::Get(); + auto& gpu = GPUResources::Get(); + + ZoneScopedN("Render Models"); + + gbufferConstant.CameraID = ctx.cameraID; + + auto view = scene->m_Registry.view(); + for (auto e : view) + { + auto [transform, mesh, visibility] = view.get(e); + if (!mesh.ModelResource || !visibility.Visible) + { + continue; + } + + gbufferConstant.Index = gpu.ModelMatrixMapping[Entity((entt::entity)e, scene.get()).GetID()]; + + for (auto& m : mesh.ModelResource->GetMeshes()) + { + Ref vkMesh = m->GetVkMesh(); + + cmd.BindDescriptorSet(ctx.renderPass->PipelineLayout, vkMesh->GetDescriptorSet(), 1); + gbufferConstant.MaterialIndex = gpu.MeshMaterialMapping[vkMesh->GetID()]; + + cmd.PushConstants(ctx.renderPass->PipelineLayout, sizeof(GBufferConstant), &gbufferConstant); + cmd.BindIndexBuffer(vkMesh->GetIndexBuffer()->GetBuffer()); + cmd.DrawIndexed(vkMesh->GetIndexBuffer()->GetSize() / sizeof(uint32_t)); + } + } }); //auto& shadingPass = GBufferPipeline.AddPass("Shading"); diff --git a/Nuake/src/Rendering/Vulkan/VkMesh.cpp b/Nuake/src/Rendering/Vulkan/VkMesh.cpp index 17d08aae..bb53eba7 100644 --- a/Nuake/src/Rendering/Vulkan/VkMesh.cpp +++ b/Nuake/src/Rendering/Vulkan/VkMesh.cpp @@ -60,7 +60,7 @@ void VkMesh::CreateDescriptorSet() auto& vk = VkRenderer::Get(); auto device = vk.GetDevice(); - DescriptorLayout = builder.Build(device, VK_SHADER_STAGE_VERTEX_BIT); + DescriptorLayout = builder.Build(device, VK_SHADER_STAGE_ALL_GRAPHICS); DescriptorSet = vk.GetDescriptorAllocator().Allocate(device, DescriptorLayout); VkDescriptorBufferInfo bufferInfo{};