diff --git a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp index f3b04563..a748e99d 100644 --- a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp +++ b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.cpp @@ -21,11 +21,12 @@ SceneRenderPipeline::SceneRenderPipeline() { // Initialize render targets const Vector2 defaultSize = { 1280, 720 }; - GBufferAlbedo = std::make_shared(ImageFormat::RGBA16F, defaultSize); - 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); + GBufferAlbedo = CreateRef(ImageFormat::RGBA16F, defaultSize); + GBufferNormal = CreateRef(ImageFormat::RGBA16F, defaultSize); + GBufferMaterial = CreateRef(ImageFormat::RGBA8, defaultSize); + GBufferDepth = CreateRef(ImageFormat::D32F, defaultSize, ImageUsage::Depth); + + ShadingOutput = CreateRef(ImageFormat::RGBA8, defaultSize); // Initialize pipeline VkShaderManager& shaderMgr = VkShaderManager::Get(); @@ -40,22 +41,22 @@ SceneRenderPipeline::SceneRenderPipeline() gBufferPass.SetPushConstant(gbufferConstant); gBufferPass.SetPreRender([&](PassRenderContext& ctx) { auto& layout = ctx.renderPass->PipelineLayout; - auto& gpu = GPUResources::Get(); - ctx.commandBuffer.BindDescriptorSet(layout, gpu.ModelDescriptor, 0); - ctx.commandBuffer.BindDescriptorSet(layout, gpu.SamplerDescriptor, 2); - ctx.commandBuffer.BindDescriptorSet(layout, gpu.MaterialDescriptor, 3); - ctx.commandBuffer.BindDescriptorSet(layout, gpu.TexturesDescriptor, 4); - ctx.commandBuffer.BindDescriptorSet(layout, gpu.LightsDescriptor, 5); - ctx.commandBuffer.BindDescriptorSet(layout, gpu.CamerasDescriptor, 6); + auto& res = GPUResources::Get(); + + Cmd& cmd = ctx.commandBuffer; + cmd.BindDescriptorSet(layout, res.ModelDescriptor, 0); + cmd.BindDescriptorSet(layout, res.SamplerDescriptor, 2); + cmd.BindDescriptorSet(layout, res.MaterialDescriptor, 3); + cmd.BindDescriptorSet(layout, res.TexturesDescriptor, 4); + cmd.BindDescriptorSet(layout, res.LightsDescriptor, 5); + cmd.BindDescriptorSet(layout, res.CamerasDescriptor, 6); }); gBufferPass.SetRender([&](PassRenderContext& ctx) { - auto& cmd = ctx.commandBuffer; - auto& scene = ctx.scene; - auto& vk = VkRenderer::Get(); - auto& gpu = GPUResources::Get(); + Cmd& cmd = ctx.commandBuffer; + Ref scene = ctx.scene; + auto& res = GPUResources::Get(); ZoneScopedN("Render Models"); - gbufferConstant.CameraID = ctx.cameraID; auto view = scene->m_Registry.view(); @@ -67,14 +68,14 @@ SceneRenderPipeline::SceneRenderPipeline() continue; } - gbufferConstant.Index = gpu.ModelMatrixMapping[Entity((entt::entity)e, scene.get()).GetID()]; + gbufferConstant.Index = res.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()]; + gbufferConstant.MaterialIndex = res.MeshMaterialMapping[vkMesh->GetID()]; cmd.PushConstants(ctx.renderPass->PipelineLayout, sizeof(GBufferConstant), &gbufferConstant); cmd.BindIndexBuffer(vkMesh->GetIndexBuffer()->GetBuffer()); diff --git a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h index d5fccf8b..dd7f78c3 100644 --- a/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h +++ b/Nuake/src/Rendering/Vulkan/SceneRenderPipeline.h @@ -70,7 +70,7 @@ namespace Nuake void SetCamera(UUID camera); void Render(PassRenderContext& ctx); - Ref GetOutput() { return ShadingOutput; } + Ref GetOutput() { return GBufferAlbedo; } private: Ref ResizeImage(Ref image, const Vector2& size); diff --git a/Nuake/src/Rendering/Vulkan/VkResources.h b/Nuake/src/Rendering/Vulkan/VkResources.h index 25e194e0..5849c413 100644 --- a/Nuake/src/Rendering/Vulkan/VkResources.h +++ b/Nuake/src/Rendering/Vulkan/VkResources.h @@ -19,10 +19,6 @@ namespace Nuake { - struct CameraData; - - - struct ModelData { std::array Data; @@ -88,11 +84,6 @@ namespace Nuake //char padding[64]; // 124 bytes to reach 128 bytes }; - struct LightResources - { - - }; - constexpr uint32_t MAX_MODEL_MATRIX = 3000; constexpr uint32_t MAX_MATERIAL = 1000; constexpr uint32_t MAX_TEXTURES = 500; diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp index 799b2593..dda392eb 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp @@ -264,7 +264,8 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) passCtx.scene = inContext.CurrentScene; passCtx.commandBuffer = inContext.CommandBuffer; passCtx.resolution = Context.Size; - + passCtx.cameraID = GPUResources::Get().GetBindlessCameraID(inContext.CameraID); + auto view = scene->m_Registry.view(); for (auto e : view) { @@ -295,27 +296,18 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) sceneRenderPipeline->Render(passCtx); } - void VkSceneRenderer::EndScene() { - auto& vk = VkRenderer::Get(); - auto& cmd = Context.CommandBuffer; - - //auto& albedo = GBufferPipeline.GetRenderPass("GBuffer").GetAttachment("Albedo"); - //auto& normal = GBufferPipeline.GetRenderPass("GBuffer").GetAttachment("Normal"); - //auto& shading = GBufferPipeline.GetRenderPass("Shading").GetAttachment("Output"); - //auto& shadow = ShadowPipeline.GetRenderPass("Shadow").GetDepthAttachment(); - //auto& selectedOutput = shading; - // Copy final output to DrawImage. - - //cmd.TransitionImageLayout(selectedOutput.Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - cmd.TransitionImageLayout(vk.DrawImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - //cmd.CopyImageToImage(selectedOutput.Image, vk.GetDrawImage()); - cmd.TransitionImageLayout(vk.DrawImage, VK_IMAGE_LAYOUT_GENERAL); - //cmd.TransitionImageLayout(selectedOutput.Image, VK_IMAGE_LAYOUT_GENERAL); - - //cmd.TransitionImageLayout(shadow.Image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + Ref drawImage = VkRenderer::Get().GetDrawImage(); + Ref output = sceneRenderPipeline->GetOutput(); + + Cmd& cmd = Context.CommandBuffer; + cmd.TransitionImageLayout(output, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + cmd.TransitionImageLayout(drawImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + cmd.CopyImageToImage(output, drawImage); + cmd.TransitionImageLayout(drawImage, VK_IMAGE_LAYOUT_GENERAL); + cmd.TransitionImageLayout(output, VK_IMAGE_LAYOUT_GENERAL); } void VkSceneRenderer::LoadShaders()