Skip to content

Commit 25a9f7a

Browse files
authored
Merge pull request #69 from wpsimon09/de-noising
Denoising
2 parents 5ac5369 + d56419b commit 25a9f7a

File tree

16 files changed

+159
-46
lines changed

16 files changed

+159
-46
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ set(SOURCES
235235
External/MikkTSpace/mikktspace.c
236236
Internal/Vulkan/Renderer/RenderingUtils.hpp
237237
Internal/Vulkan/Renderer/RenderingUtils.cpp
238+
Internal/Application/Structs/ParameterStructs.hpp
238239
)
239240

240241

Internal/Application/ApplicationState/ApplicationState.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
#include "Vulkan/Utils/VUniformBufferManager/UnifromsRegistry.hpp"
77

88
namespace ApplicationCore {
9-
ApplicationState::ApplicationState() {}
10-
9+
ApplicationState::ApplicationState()
10+
: m_bilaterialFilaterParameters{}
11+
{
12+
}
1113

1214
void ApplicationState::Update() {}
1315

@@ -69,5 +71,9 @@ void ApplicationState::SetIsWindowResized(bool windowResized)
6971
{
7072
m_windowResized = windowResized;
7173
}
74+
BilaterialFilterParameters& ApplicationState::GetBilateralFilaterParameters()
75+
{
76+
return m_bilaterialFilaterParameters;
77+
}
7278

7379
} // namespace ApplicationCore

Internal/Application/ApplicationState/ApplicationState.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88

99
#include "Application/Enums/ClientEnums.hpp"
10+
#include "Application/Structs/ParameterStructs.hpp"
1011
#include "Vulkan/Utils/VUniformBufferManager/UnifromsRegistry.hpp"
1112
struct GlobalRenderingInfo;
1213
struct SceneUpdateFlags;
@@ -43,6 +44,8 @@ class ApplicationState
4344
PostProcessingParameters& GetPostProcessingParameters();
4445
void pSetPostProcessingParameters(PostProcessingParameters* pPostProcessingParameters);
4546

47+
BilaterialFilterParameters& GetBilateralFilaterParameters();
48+
4649
bool& IsWindowResized();
4750
void SetIsWindowResized(bool windowResized);
4851

@@ -59,7 +62,8 @@ class ApplicationState
5962
SceneUpdateFlags* m_sceneUpdateFlags = nullptr;
6063
GlobalRenderingInfo* m_globalRenderingInfo = nullptr;
6164
PostProcessingParameters* m_postProcessingParameters = nullptr;
62-
bool m_windowResized = false;
65+
BilaterialFilterParameters m_bilaterialFilaterParameters;
66+
bool m_windowResized = false;
6367
};
6468

6569
} // namespace ApplicationCore

Internal/Application/AssetsManger/EffectsLibrary/EffectsLibrary.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,9 +377,7 @@ void EffectsLibrary::ConfigureDescriptorWrites(const Renderer::ForwardRenderer&
377377

378378
//===================================
379379
// for ray query we need acceleration strucutre
380-
e->WriteImage(i, 0, 4,
381-
sceneRenderer.GetShadowMapOutput().GetPrimaryImage().GetDescriptorImageInfo(
382-
VulkanCore::VSamplers::Sampler2D));
380+
e->WriteImage(i, 0, 4, sceneRenderer.GetDenoisedVisibilityBuffer().GetDescriptorImageInfo(VulkanCore::VSamplers::Sampler2D));
383381

384382
break;
385383
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef PARAMETERSTRUCTS_HPP
2+
3+
#define PARAMETERSTRUCTS_HPP
4+
5+
struct BilaterialFilterParameters
6+
{
7+
float sigma = 4.0f;
8+
float BSigma = 0.9f;
9+
float width;
10+
float height;
11+
};
12+
13+
#endif

Internal/Editor/Views/Settings/Settings.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ void Settings::RenderRenderingSettings()
199199
ImGui::TreePop();
200200
}
201201

202+
if(ImGui::TreeNode("De-noising"))
203+
{
204+
ImGui::DragFloat("Sigma", &applicationState.GetBilateralFilaterParameters().sigma);
205+
ImGui::DragFloat("B Sigma", &applicationState.GetBilateralFilaterParameters().BSigma);
206+
207+
ImGui::TreePop();
208+
}
209+
202210
ImGui::TreePop();
203211
}
204212

Internal/Vulkan/Renderer/Renderers/ForwardRenderer.cpp

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
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+
254256
void 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

443447
void 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

Internal/Vulkan/Renderer/Renderers/ForwardRenderer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class ForwardRenderer
6666
Renderer::RenderTarget2& GetShadowMapOutput() const;
6767
Renderer::RenderTarget2& GetLightPassOutput() const;
6868
Renderer::RenderTarget2& GetNormalBufferOutput() const;
69+
VulkanCore::VImage2& GetDenoisedVisibilityBuffer() const;
6970

7071
void Destroy();
7172

Internal/Vulkan/Renderer/Renderers/RenderingSystem.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,16 @@ void RenderingSystem::Init()
120120
m_uiContext.GetViewPortContext(ViewPortType::eMainRayTracer).SetImage(m_postProcessingSystem->GetRenderedResult(i), i);
121121
m_uiContext.GetViewPortContext(ViewPortType::ePositionBuffer)
122122
.SetImage(m_forwardRenderer->GetPositionBufferOutput().GetResolvedImage(), i);
123-
m_uiContext.GetViewPortContext(ViewPortType::eShadowMap).SetImage(m_forwardRenderer->GetShadowMapOutput().GetPrimaryImage(), i);
123+
m_uiContext.GetViewPortContext(ViewPortType::eShadowMap).SetImage(m_forwardRenderer->GetDenoisedVisibilityBuffer(), i);
124124
m_uiContext.GetViewPortContext(ViewPortType::ePositionBuffer)
125125
.SetImage(m_forwardRenderer->GetPositionBufferOutput().GetResolvedImage(), i);
126-
m_uiContext.GetViewPortContext(ViewPortType::eNormalBuffer).SetImage(m_forwardRenderer->GetNormalBufferOutput().GetResolvedImage(), i);
126+
m_uiContext.GetViewPortContext(ViewPortType::eNormalBuffer).SetImage(m_forwardRenderer->GetNormalBufferOutput().GetPrimaryImage(), i);
127127
}
128128
}
129129

130130
void RenderingSystem::Render(ApplicationCore::ApplicationState& applicationState)
131131
{
132+
132133
m_renderingTimeLine[m_currentFrameIndex]->CpuWaitIdle(8);
133134

134135

@@ -180,6 +181,7 @@ void RenderingSystem::Render(ApplicationCore::ApplicationState& applicationState
180181
m_renderingCommandBuffers[m_currentFrameIndex]->Reset();
181182
m_frameCount++;
182183

184+
183185
if(applicationState.GetSceneUpdateFlags().resetAccumulation)
184186
{
185187
// reset the accumulation
@@ -202,12 +204,9 @@ void RenderingSystem::Render(ApplicationCore::ApplicationState& applicationState
202204
applicationState.GetGlobalRenderingInfo().numberOfFrames = m_frameCount;
203205
}
204206

205-
m_uniformBufferManager.UpdatePerFrameUniformData(m_currentFrameIndex, applicationState.GetGlobalRenderingInfo(),
206-
applicationState.GetPostProcessingParameters());
207-
m_uniformBufferManager.UpdateLightUniformData(m_currentFrameIndex, applicationState.GetSceneLightInfo());
208-
m_uniformBufferManager.UpdatePerObjectUniformData(m_currentFrameIndex, m_renderContext.GetAllDrawCall());
209-
m_uniformBufferManager.UpdateSceneDataInfo(m_currentFrameIndex, applicationState.GetSceneData());
210-
207+
//=====================================================================
208+
// IMPORTANT: this sends all data accumulated over the frame to the GPU
209+
m_uniformBufferManager.Update(m_currentFrameIndex, applicationState, m_renderContext.GetAllDrawCall());
211210

212211
m_device.GetTransferOpsManager().UpdateGPUWaitCPU();
213212

Internal/Vulkan/Utils/VEnvLightGenerator/VEnvLightGenerator.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ void VulkanUtils::VEnvLightGenerator::HDRToCubeMap(std::shared_ptr<VulkanCore::V
286286
pcInfo.layout = m_hdrToCubeMapEffect->GetPipelineLayout();
287287
pcInfo.offset = 0;
288288
pcInfo.size = sizeof(PushBlock);
289-
pcInfo.stageFlags = vk::ShaderStageFlagBits::eVertex;
289+
pcInfo.stageFlags = vk::ShaderStageFlagBits::eAll;
290290
pcInfo.pValues = &viewProjPushBlock;
291291

292292
cmdBuffer.pushConstants2(pcInfo);
@@ -406,7 +406,7 @@ void VulkanUtils::VEnvLightGenerator::CubeMapToIrradiance(std::shared_ptr<Vulkan
406406
pcInfo.layout = m_hdrToIrradianceEffect->GetPipelineLayout();
407407
pcInfo.offset = 0;
408408
pcInfo.size = sizeof(PushBlock);
409-
pcInfo.stageFlags = vk::ShaderStageFlagBits::eVertex;
409+
pcInfo.stageFlags = vk::ShaderStageFlagBits::eAll;
410410
pcInfo.pValues = &viewProjPushBlock;
411411

412412
cmdBuffer.pushConstants2(pcInfo);
@@ -554,7 +554,7 @@ void VulkanUtils::VEnvLightGenerator::CubeMapToPrefilter(std::shared_ptr<VulkanC
554554
pcInfo.layout = m_prefilterEffect->GetPipelineLayout();
555555
pcInfo.offset = 0;
556556
pcInfo.size = sizeof(PushBlock);
557-
pcInfo.stageFlags = vk::ShaderStageFlagBits::eVertex;
557+
pcInfo.stageFlags = vk::ShaderStageFlagBits::eAll;
558558
pcInfo.pValues = &pushBlock;
559559

560560
cmdBuffer.pushConstants2(pcInfo);

0 commit comments

Comments
 (0)