1414
1515#include " Application/AssetsManger/Utils/VTextureAsset.hpp"
1616#include " Application/Rendering/Material/PBRMaterial.hpp"
17+ #include " Application/Structs/ParameterStructs.hpp"
1718#include " Application/Utils/LookUpTables.hpp"
1819#include " Application/VertexArray/VertexArray.hpp"
1920#include " Vulkan/Global/GlobalVariables.hpp"
@@ -80,8 +81,7 @@ ForwardRenderer::ForwardRenderer(const VulkanCore::VDevice& device,
8081
8182 m_visiblityBuffer_Denoised = std::make_unique<VulkanCore::VImage2>(m_device, m_visiblityBuffer_DenoisedCI);
8283
83- VulkanUtils::RecordImageTransitionLayoutCommand (*m_visiblityBuffer_Denoised,
84- vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eUndefined,
84+ VulkanUtils::RecordImageTransitionLayoutCommand (*m_visiblityBuffer_Denoised, vk::ImageLayout::eGeneral, vk::ImageLayout::eUndefined,
8585 m_device.GetTransferOpsManager ().GetCommandBuffer ());
8686 // ===========================================
8787 // ===== CREATE RENDER TARGETS
@@ -175,13 +175,6 @@ ForwardRenderer::ForwardRenderer(const VulkanCore::VDevice& device,
175175 i, 0 , 5 , m_normalBufferOutput->GetResolvedImage ().GetDescriptorImageInfo (VulkanCore::VSamplers::SamplerDepth));
176176
177177 m_rtxShadowPassEffect->ApplyWrites (i);
178-
179- m_bilateralDenoiser->SetNumWrites (0 , 2 , 0 );
180-
181- m_bilateralDenoiser->WriteImage (
182- i, 0 , 1 , m_visibilityBuffer->GetResolvedImage ().GetDescriptorImageInfo (VulkanCore::VSamplers::Sampler2D));
183-
184- m_bilateralDenoiser->WriteImage (i, 0 , 2 , m_visiblityBuffer_Denoised->GetDescriptorImageInfo ());
185178 }
186179
187180
@@ -210,6 +203,10 @@ void ForwardRenderer::Render(int currentFr
210203 // generates shadow mapp in screen space
211204 ShadowMapPass (currentFrameIndex, cmdBuffer, uniformBufferManager);
212205
206+ // ===========================
207+ // denoise the shadow pass
208+ DenoiseVisibility (currentFrameIndex, cmdBuffer, uniformBufferManager);
209+
213210 // ============================
214211 // uses forward renderer to render the scene
215212 DrawScene (currentFrameIndex, cmdBuffer, uniformBufferManager);
@@ -251,6 +248,11 @@ Renderer::RenderTarget2& ForwardRenderer::GetNormalBufferOutput() const
251248 return *m_normalBufferOutput;
252249}
253250
251+ VulkanCore::VImage2& ForwardRenderer::GetDenoisedVisibilityBuffer () const
252+ {
253+ return *m_visiblityBuffer_Denoised;
254+ }
255+
254256void ForwardRenderer::DepthPrePass (int currentFrameIndex,
255257 VulkanCore::VCommandBuffer& cmdBuffer,
256258 const VulkanUtils::VUniformBufferManager& uniformBufferManager)
@@ -439,11 +441,53 @@ void ForwardRenderer::ShadowMapPass(int cu
439441 vk::ImageLayout::eColorAttachmentOptimal);
440442}
441443
444+ // ==================================================================
445+ // De noiser pass, applies bilateral filter to the visibility buffer
442446
443447void ForwardRenderer::DenoiseVisibility (int currentFrameIndex,
444448 VulkanCore::VCommandBuffer& cmdBuffer,
445449 const VulkanUtils::VUniformBufferManager& uniformBufferManager)
446450{
451+ assert (cmdBuffer.GetIsRecording () && " Command buffer is not in recording state" );
452+
453+ VulkanUtils::PlaceImageMemoryBarrier (*m_visiblityBuffer_Denoised, cmdBuffer, vk::ImageLayout::eShaderReadOnlyOptimal,
454+ vk::ImageLayout::eGeneral, vk::PipelineStageFlagBits::eColorAttachmentOutput,
455+ vk::PipelineStageFlagBits::eComputeShader,
456+ vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderWrite);
457+
458+ m_bilateralDenoiser->SetNumWrites (0 , 2 , 0 );
459+
460+ m_bilateralDenoiser->WriteImage (currentFrameIndex, 0 , 1 ,
461+ m_visibilityBuffer->GetPrimaryImage ().GetDescriptorImageInfo (VulkanCore::VSamplers::Sampler2D));
462+
463+ m_bilateralDenoiser->WriteImage (currentFrameIndex, 0 , 2 , m_visiblityBuffer_Denoised->GetDescriptorImageInfo ());
464+
465+ m_bilateralDenoiser->ApplyWrites (currentFrameIndex);
466+
467+ m_bilateralDenoiser->BindPipeline (cmdBuffer.GetCommandBuffer ());
468+ m_bilateralDenoiser->BindDescriptorSet (cmdBuffer.GetCommandBuffer (), currentFrameIndex, 0 );
469+
470+ BilaterialFilterParameters pc = uniformBufferManager.GetApplicationState ()->GetBilateralFilaterParameters ();
471+
472+ pc.width = m_visiblityBuffer_Denoised->GetImageInfo ().width ;
473+ pc.height = m_visiblityBuffer_Denoised->GetImageInfo ().height ;
474+
475+ vk::PushConstantsInfo pcInfo;
476+ pcInfo.layout = m_bilateralDenoiser->GetPipelineLayout ();
477+ pcInfo.size = sizeof (BilaterialFilterParameters);
478+ pcInfo.offset = 0 ;
479+ pcInfo.pValues = &pc;
480+ pcInfo.stageFlags = vk::ShaderStageFlagBits::eAll;
481+
482+ m_bilateralDenoiser->CmdPushConstant (cmdBuffer.GetCommandBuffer (), pcInfo);
483+
484+ cmdBuffer.GetCommandBuffer ().dispatch (m_visiblityBuffer_Denoised->GetImageInfo ().width / 16 ,
485+ m_visiblityBuffer_Denoised->GetImageInfo ().height / 16 , 1 );
486+
487+ VulkanUtils::PlaceImageMemoryBarrier (*m_visiblityBuffer_Denoised, cmdBuffer, vk::ImageLayout::eGeneral,
488+ vk::ImageLayout::eShaderReadOnlyOptimal, vk::PipelineStageFlagBits::eComputeShader,
489+ vk::PipelineStageFlagBits::eFragmentShader, vk::AccessFlagBits::eShaderWrite,
490+ vk::AccessFlagBits::eShaderRead);
447491}
448492
449493
@@ -638,7 +682,7 @@ void ForwardRenderer::PushDrawCallId(const vk::CommandBuffer& cmdBuffer, VulkanS
638682 pcInfo.size = sizeof (PerObjectPushConstant);
639683 pcInfo.offset = 0 ;
640684 pcInfo.pValues = &pc;
641- pcInfo.stageFlags = vk::ShaderStageFlagBits::eVertex ;
685+ pcInfo.stageFlags = vk::ShaderStageFlagBits::eAll ;
642686
643687 drawCall.effect ->CmdPushConstant (cmdBuffer, pcInfo);
644688}
@@ -653,6 +697,7 @@ void ForwardRenderer::Destroy()
653697 m_positionBufferOutput->Destroy ();
654698 m_fogPassOutput->Destroy ();
655699 m_normalBufferOutput->Destroy ();
700+ m_visiblityBuffer_Denoised->Destroy ();
656701 // m_shadowMap->Destroy();
657702}
658703} // namespace Renderer
0 commit comments