Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
DeferredRenderer.hpp
1#pragma once
2
3#include <vector>
4#include <glm/glm.hpp>
5
6#include <Common/ResourcePipeline/Uuid.hpp>
7#include <EngineCore/Assets/PipelineSet/GraphicsPipelineAsset.hpp>
8#include <EngineCore/Assets/PipelineSet/ComputePipelineAsset.hpp>
9#include <EngineCore/Assets/AssetReference.hpp>
10#include <EngineCore/Rendering/BaseRenderer.hpp>
11
12namespace Grindstone {
13 namespace GraphicsAPI {
14 class Buffer;
15 class Framebuffer;
16 class Image;
18 class GraphicsPipeline;
19 class ComputePipeline;
20 class CommandBuffer;
21 };
22
23 class DeferredRenderer : public BaseRenderer {
24 public:
25 DeferredRenderer(GraphicsAPI::RenderPass* targetRenderPass);
26 virtual ~DeferredRenderer();
27 virtual bool OnWindowResize(Events::BaseEvent*) override;
28 virtual void Resize(uint32_t width, uint32_t height) override;
29 virtual void Render(
30 GraphicsAPI::CommandBuffer* commandBuffer,
31 entt::registry& registry,
32 glm::mat4 projectionMatrix,
33 glm::mat4 viewMatrix,
34 glm::vec3 eyePos,
35 GraphicsAPI::Framebuffer* outputFramebuffer
36 ) override;
37
38 virtual uint16_t GetRenderModeCount() const override;
39 virtual const RenderMode* GetRenderModes() const override;
40 virtual void SetRenderMode(uint16_t mode) override;
41 virtual std::vector<Grindstone::Rendering::GeometryRenderStats> GetRenderingStats() override;
42
43 enum class DeferredRenderMode : uint16_t {
44 Default,
45 Position,
46 PositionMod,
47 ViewPosition,
48 ViewPositionMod,
49 Depth,
50 DepthMod,
51 Normal,
52 ViewNormal,
53 Albedo,
54 Specular,
55 Roughness,
56 AmbientOcclusion,
57 Count
58 };
59
60 private:
61 struct DeferredRendererImageSet {
62 GraphicsAPI::Framebuffer* gbuffer = nullptr;
63 GraphicsAPI::Image* gbufferDepthStencilTarget = nullptr;
64 GraphicsAPI::Framebuffer* litHdrFramebuffer = nullptr;
65 GraphicsAPI::Framebuffer* lightingFramebuffer = nullptr;
66 GraphicsAPI::Image* litHdrRenderTarget = nullptr;
67 GraphicsAPI::Image* ssrRenderTarget = nullptr;
68 GraphicsAPI::Image* gbufferAlbedoRenderTarget = nullptr;
69 GraphicsAPI::Image* gbufferNormalRenderTarget = nullptr;
70 GraphicsAPI::Image* gbufferSpecularRoughnessRenderTarget = nullptr;
71
72 GraphicsAPI::Framebuffer* ambientOcclusionFramebuffer = nullptr;
73 GraphicsAPI::Image* ambientOcclusionRenderTarget = nullptr;
74 GraphicsAPI::Framebuffer* blurredAmbientOcclusionFramebuffer = nullptr;
75 GraphicsAPI::Image* blurredAmbientOcclusionRenderTarget = nullptr;
76
77 GraphicsAPI::Buffer* globalUniformBufferObject = nullptr;
78 GraphicsAPI::Buffer* debugUniformBufferObject = nullptr;
79 GraphicsAPI::Buffer* tonemapPostProcessingUniformBufferObject = nullptr;
80
81 GraphicsAPI::DescriptorSet* ssrDescriptorSet = nullptr;
82 GraphicsAPI::DescriptorSet* tonemapDescriptorSet = nullptr;
83 GraphicsAPI::DescriptorSet* gbufferDescriptorSet = nullptr;
84 GraphicsAPI::DescriptorSet* ssaoGbufferDescriptorSet = nullptr;
85 GraphicsAPI::DescriptorSet* debugDescriptorSet = nullptr;
86 GraphicsAPI::DescriptorSet* engineDescriptorSet = nullptr;
87
88 GraphicsAPI::DescriptorSet* dofSourceDescriptorSet = nullptr;
89 GraphicsAPI::DescriptorSet* dofNearBlurDescriptorSet = nullptr;
90 GraphicsAPI::DescriptorSet* dofFarBlurDescriptorSet = nullptr;
91 GraphicsAPI::DescriptorSet* dofCombineDescriptorSet = nullptr;
92 GraphicsAPI::DescriptorSet* blurredSsaoInputDescriptorSet = nullptr;
93
94 GraphicsAPI::DescriptorSet* ambientOcclusionDescriptorSet = nullptr;
95
96 GraphicsAPI::Image* nearDofRenderTarget = nullptr;
97 GraphicsAPI::Image* farDofRenderTarget = nullptr;
98 GraphicsAPI::Image* nearBlurredDofRenderTarget = nullptr;
99 GraphicsAPI::Image* farBlurredDofRenderTarget = nullptr;
100
101 GraphicsAPI::Framebuffer* dofSeparationFramebuffer = nullptr;
102 GraphicsAPI::Framebuffer* dofNearBlurFramebuffer = nullptr;
103 GraphicsAPI::Framebuffer* dofFarBlurFramebuffer = nullptr;
104 GraphicsAPI::Framebuffer* dofCombinationFramebuffer = nullptr;
105
106 std::vector<GraphicsAPI::Image*> bloomRenderTargets;
107 std::vector<GraphicsAPI::DescriptorSet*> bloomDescriptorSets;
108
111 Grindstone::Rendering::GeometryRenderStats renderingStatsTransparent;
113 };
114
115 void CreatePipelines();
116 void CreateBloomUniformBuffers();
117 void UpdateBloomDescriptorSet(DeferredRendererImageSet& imageSet);
118 void CreateDepthOfFieldRenderTargetsAndDescriptorSets(DeferredRendererImageSet& imageSet, size_t imageSetIndex);
119 void CreateSsrRenderTargetsAndDescriptorSets(DeferredRendererImageSet& imageSet, size_t imageSetIndex);
120 void CreateBloomRenderTargetsAndDescriptorSets(DeferredRendererImageSet& imageSet, size_t imageSetIndex);
121 void RenderDepthOfField(DeferredRendererImageSet& imageSet, GraphicsAPI::CommandBuffer* currentCommandBuffer);
122 void RenderSsr(DeferredRendererImageSet& imageSet, GraphicsAPI::CommandBuffer* currentCommandBuffer);
123 void RenderBloom(DeferredRendererImageSet& imageSet, GraphicsAPI::CommandBuffer* currentCommandBuffer);
124 void UpdateBloomUBO();
125
126 void RenderSsao(DeferredRendererImageSet& imageSet, GraphicsAPI::CommandBuffer* commandBuffer);
127 void RenderShadowMaps(GraphicsAPI::CommandBuffer* commandBuffer, entt::registry& registry);
128 void RenderLights(uint32_t imageIndex, GraphicsAPI::CommandBuffer* currentCommandBuffer, entt::registry& registry);
129 void PostProcess(uint32_t imageIndex, GraphicsAPI::Framebuffer* framebuffer, GraphicsAPI::CommandBuffer* currentCommandBuffer);
130 void Debug(uint32_t imageIndex, GraphicsAPI::Framebuffer* outputFramebuffer, GraphicsAPI::CommandBuffer* commandBuffer);
131
132 void CreateDepthOfFieldResources();
133 void CreateBloomResources();
134 void CreateSSRResources();
135 void CreateSsaoKernelAndNoise();
136 void CreateDescriptorSetLayouts();
137 void CreateGbufferFramebuffer();
138 void CreateLitHDRFramebuffer();
139 void CreateDescriptorSets(DeferredRendererImageSet& imageSet);
140 void UpdateDescriptorSets(DeferredRendererImageSet& imageSet);
141 void CreateUniformBuffers();
142 void CreateVertexAndIndexBuffersAndLayouts();
143
144 struct PostProcessUbo {
145 glm::vec4 vignetteColor = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
146 float vignetteRadius = 0.75f;
147 float vignetteSoftness = 0.8f;
148 float grainAmount = 0.0007f;
149 float grainPixelSize = 1.0f;
150 glm::vec2 chromaticDistortionRedOffset = glm::vec2(0.00045f, 0.00045f);
151 glm::vec2 chromaticDistortionGreenOffset = glm::vec2(0.0003f, 0.0003f);
152 glm::vec2 chromaticDistortionBlueOffset = glm::vec2(-0.0003f, -0.0003f);
153 float paniniDistortionStrength = 0.0f;
154 bool isAnimated = true;
155 };
156
157 PostProcessUbo postProcessUboData;
158
159 struct DebugUboData {
160 uint32_t renderMode;
161 float nearDistance;
162 float farDistance;
163 };
164
165 DebugUboData debugUboData;
166
167 uint32_t framebufferWidth = 0u;
168 uint32_t framebufferHeight = 0u;
169 uint32_t renderWidth = 0u;
170 uint32_t renderHeight = 0u;
171
172 size_t bloomStoredMipLevelCount = 0;
173 size_t bloomMipLevelCount = 0;
175
176 std::vector<DeferredRendererImageSet> deferredRendererImageSets;
177 std::vector<GraphicsAPI::Buffer*> bloomUniformBuffers;
178 size_t bloomFirstUpsampleIndex = 0;
179
180 GraphicsAPI::Buffer* ssaoUniformBuffer = nullptr;
181 GraphicsAPI::Image* ssaoNoiseTexture = nullptr;
182 GraphicsAPI::Sampler* ssaoNoiseSampler = nullptr;
183 GraphicsAPI::Sampler* screenSampler = nullptr;
184 GraphicsAPI::DescriptorSetLayout* ambientOcclusionDescriptorSetLayout = nullptr;
185 GraphicsAPI::DescriptorSetLayout* ssaoInputDescriptorSetLayout = nullptr;
186 GraphicsAPI::DescriptorSet* ssaoInputDescriptorSet = nullptr;
187 GraphicsAPI::DescriptorSetLayout* blurredSsaoInputDescriptorSetLayout = nullptr;
188
189 GraphicsAPI::VertexInputLayout vertexLightPositionLayout{};
190
191 GraphicsAPI::DescriptorSetLayout* bloomDescriptorSetLayout = nullptr;
192 GraphicsAPI::DescriptorSetLayout* ssrDescriptorSetLayout = nullptr;
193 GraphicsAPI::DescriptorSetLayout* tonemapDescriptorSetLayout = nullptr;
194 GraphicsAPI::DescriptorSetLayout* debugDescriptorSetLayout = nullptr;
195 GraphicsAPI::DescriptorSetLayout* lightingDescriptorSetLayout = nullptr;
196 GraphicsAPI::DescriptorSetLayout* ssaoDescriptorSetLayout = nullptr;
197 GraphicsAPI::DescriptorSetLayout* lightingUBODescriptorSetLayout = nullptr;
198 GraphicsAPI::DescriptorSetLayout* shadowMappedLightDescriptorSetLayout = nullptr;
199 GraphicsAPI::DescriptorSetLayout* lightingWithShadowUBODescriptorSetLayout = nullptr;
200 GraphicsAPI::DescriptorSetLayout* engineDescriptorSetLayout = nullptr;
201 GraphicsAPI::DescriptorSetLayout* shadowMapDescriptorSetLayout = nullptr;
202
203 GraphicsAPI::DescriptorSet* shadowMapDescriptorSet = nullptr;
204
205 GraphicsAPI::RenderPass* targetRenderPass = nullptr;
206
207 GraphicsAPI::Buffer* vertexBuffer;
208 GraphicsAPI::Buffer* indexBuffer;
209 GraphicsAPI::VertexArrayObject* planePostProcessVao = nullptr;
210
222
225
226 GraphicsAPI::DescriptorSetLayout* dofSourceDescriptorSetLayout = nullptr;
227 GraphicsAPI::DescriptorSetLayout* dofBlurDescriptorSetLayout = nullptr;
228 GraphicsAPI::DescriptorSetLayout* dofCombinationDescriptorSetLayout = nullptr;
229
230 // Used to check when environment map changes, so we can update it
231 Uuid currentEnvironmentMapUuid;
232
233 DeferredRenderMode renderMode;
234 };
235}
Definition BaseRenderer.hpp:19
Definition Buffer.hpp:56
Definition CommandBuffer.hpp:59
Definition ComputePipeline.hpp:18
Definition DescriptorSetLayout.hpp:13
Definition DescriptorSet.hpp:15
Definition Framebuffer.hpp:16
Definition GraphicsPipeline.hpp:19
Definition Image.hpp:48
Definition RenderPass.hpp:27
Definition Sampler.hpp:31
Definition VertexArrayObject.hpp:9
Definition Uuid.hpp:7
Definition AssetReference.hpp:45
Definition BaseRenderer.hpp:21
Definition BaseEvent.hpp:7
Definition GeometryRenderingStats.hpp:6