SpiecsEngine
 
Loading...
Searching...
No Matches
PostProcessRenderer.cpp
Go to the documentation of this file.
1/**
2* @file PostProcessRenderer.cpp.
3* @brief The PostProcessRenderer Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
9
10namespace Spices {
11
12 namespace PostProcessR
13 {
15 {
17 uint32_t mipmap;
18 float weight;
19 };
20 }
21
23 {
25
26 RendererPassBuilder{ "PostProcess", this }
27 .AddSubPass("DownSample")
29 .AddSubPass("Bloom")
31 .AddSubPass("TAA")
33 .AddSubPass("ToneMapping")
36 }
37
39 {
41
42 const auto image = m_RendererResourcePool->AccessRowResource("SceneColor").get();
43
44 DescriptorSetBuilder{ "DownSample", this }
45 .AddPushConstant(sizeof(uint32_t))
46 .AddStorageTexture(2, 0, VK_SHADER_STAGE_COMPUTE_BIT, { "SceneColor" })
47 .AddStorageTextureMipmaps(2, 1, VK_SHADER_STAGE_COMPUTE_BIT, "Bloom", image->GetFormat(), TextureType::Texture2D, [&](RendererResourceCreateInfo& info) {
48 info.mipLevel = SpicesShader::POST_BLOOM_MIPMAP;
49 info.sizeScale = 0.5f;
50 })
51 .Build();
52
53 DescriptorSetBuilder{ "Bloom", this }
54 .AddPushConstant(sizeof(PostProcessR::BloomPushConstant))
55 .AddStorageTexture(2, 0, VK_SHADER_STAGE_COMPUTE_BIT, { "SceneColor" })
56 .AddStorageTextureMipmaps(2, 1, VK_SHADER_STAGE_COMPUTE_BIT, "Bloom", image->GetFormat(), TextureType::Texture2D, [&](RendererResourceCreateInfo& info) {
57 info.mipLevel = SpicesShader::POST_BLOOM_MIPMAP;
58 info.sizeScale = 0.5f;
59 })
60 .Build();
61
62 DescriptorSetBuilder{ "TAA", this }
63 .Build();
64
65 DescriptorSetBuilder{ "ToneMapping", this }
66 .AddPushConstant(sizeof(uint64_t))
67 .AddStorageTexture(2, 0, VK_SHADER_STAGE_COMPUTE_BIT, { "SceneColor" })
68 .Build();
69 }
70
72 std::shared_ptr<Material> material ,
73 VkPipelineLayout& layout ,
74 std::shared_ptr<RendererSubPass> subPass
75 )
76 {
78
79 PipelineBuilder{ subPass, material, this }
80 .SetPipelineLayout(layout)
81 .BuildCompute();
82 }
83
85 {
87
88 const auto bloomImage = m_RendererResourcePool->AccessRowResource("Bloom").get();
89
90 ComputeRenderBehaveBuilder builder{ this ,frameInfo.m_FrameIndex, frameInfo.m_ImageIndex, m_VulkanState.m_GraphicCommandBuffer };
91
92 builder.BeginRenderPass();
93
94 builder.BindDescriptorSet(DescriptorSetManager::GetByName("PreRenderer"));
95
96 builder.BindDescriptorSet(DescriptorSetManager::GetByName({ m_Pass->GetName(), "DownSample" }));
97
98 builder.BindPipeline("PostProcessRenderer.DownSample.Default");
99
100 for (uint32_t i = 0; i < bloomImage->GetMipLevels(); i++)
101 {
102 builder.UpdatePushConstant<uint32_t>([&](auto& push) {
103 push = i;
104 });
105
106 builder.Dispatch((bloomImage->GetWidth() >> i) / 32 + 1, (bloomImage->GetHeight() >> i) / 32 + 1, 1);
107
108 builder.InternalBarriers();
109 }
110
111 builder.BeginNextSubPass("Bloom");
112
113 builder.BindDescriptorSet(DescriptorSetManager::GetByName({ m_Pass->GetName(), "Bloom" }));
114
115 builder.BindPipeline("PostProcessRenderer.Bloom.Default");
116
117 for (int i = bloomImage->GetMipLevels() - 1; i >= 0; i--)
118 {
119 builder.UpdatePushConstant<PostProcessR::BloomPushConstant>([&](auto& push) {
120 push.materialAddress = GetDefaultMaterial("Bloom")->GetMaterialParamsAddress();
121 push.mipmap = i;
122 push.weight = i == 0 ? 0.08f : 1.0f;
123 });
124
125 builder.Dispatch(((bloomImage->GetWidth() * 2) >> i) / 32 + 1, ((bloomImage->GetHeight() * 2) >> i) / 32 + 1, 1);
126
127 builder.InternalBarriers();
128 }
129
130 builder.BeginNextSubPass("TAA");
131
132 builder.BindDescriptorSet(DescriptorSetManager::GetByName({ m_Pass->GetName(), "TAA" }));
133
134 builder.BindPipeline("PostProcessRenderer.TAA.Default");
135
136 builder.Dispatch(1, 1, 1);
137
138 builder.InternalBarriers();
139
140 builder.BeginNextSubPass("ToneMapping");
141
142 const auto sceneColor = m_RendererResourcePool->AccessRowResource("SceneColor").get();
143
144 builder.BindDescriptorSet(DescriptorSetManager::GetByName({ m_Pass->GetName(), "ToneMapping" }));
145
146 builder.BindPipeline("PostProcessRenderer.ToneMapping.Default");
147
148 builder.UpdatePushConstant<uint64_t>([&](auto& push) {
149 push = GetDefaultMaterial("ToneMapping")->GetMaterialParamsAddress();
150 });
151
152 builder.Dispatch(sceneColor->GetWidth() / 32 + 1, sceneColor->GetHeight() / 32 + 1, 1);
153
154 builder.InternalBarriers();
155
156 builder.EndRenderPass();
157 }
158}
#define SPICES_PROFILE_ZONE
uint32_t m_FrameIndex
FrameIndex, varying during 0 - (MaxFrameInFlight - 1). Used almost anywhere.
Definition FrameInfo.h:69
uint32_t m_ImageIndex
ImageIndex, varying during 0 - (MaxFrameInFlight - 1). Used in swapchain index and framebuffer index.
Definition FrameInfo.h:75
FrameInfo Class. This class defines the FrameInfo data.
Definition FrameInfo.h:32
Material Class. This class contains a branch of parameter and shader, also descriptor.
Definition Material.h:62
virtual void Render(TimeStep &ts, FrameInfo &frameInfo) override
The interface is inherited from Renderer.
virtual void CreateRendererPass() override
The interface is inherited from Renderer. Create Specific Renderer pass.
virtual void CreateDescriptorSet() override
The interface is inherited from Renderer. Create specific descriptor set for sub pass.
virtual void CreatePipeline(std::shared_ptr< Material > material, VkPipelineLayout &layout, std::shared_ptr< RendererSubPass > subPass) override
The interface is inherited from Renderer. Create Material Specific Pipeline.
PostProcessRenderer Class. This class defines the PostProcess render behaves.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.
void Dispatch(uint32_t x, uint32_t y, uint32_t z) const
Dispatch Compute Shader.
virtual void BeginRenderPass() override
Begin this Renderer's RenderPass.
Definition Renderer.cpp:900
virtual void BeginNextSubPass(const std::string &subPassName) override
End a preview sub pass and stat next sub pass.
Definition Renderer.cpp:787
virtual void EndRenderPass() override
End this Renderer's RenderPass.
This class helps to bind pipeline and bind buffer. Specific for pure Compute Renderer....
Definition Renderer.h:1739
RendererPassBuilder & EndSubPass()
End recording a sub pass.
void Build() const
Build the RendererPass.
RendererPassBuilder & AddSubPass(const std::string &subPassName, Querier::StatisticsFlags flags=Querier::ALL)
Add a new SubPass to Renderer Pass.
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
Definition Renderer.h:1992
This Class handles our engine time step during frames. Global Unique.
Definition TimeStep.h:22