CSEngine
Loading...
Searching...
No Matches
CSE::DeferredRenderGroup Class Reference

#include <DeferredRenderGroup.h>

Inheritance diagram for CSE::DeferredRenderGroup:
CSE::SRenderGroup

Public Member Functions

 DeferredRenderGroup (const RenderMgr &renderMgr)
 
void RegisterObject (SIRender *object) override
 
void RemoveObjects (SIRender *object) override
 
void RenderAll (const CameraBase &camera) const override
 
void RenderGbuffer (const CameraBase &camera, const SGBuffer &gbuffer, const SShaderGroup &shaders) const
 
void SetViewport ()
 
void Exterminate () override
 
- Public Member Functions inherited from CSE::SRenderGroup
 SRenderGroup (const RenderMgr &renderMgr)
 

Additional Inherited Members

- Static Protected Member Functions inherited from CSE::SRenderGroup
static void BindSourceBuffer (const SFrameBuffer &buffer, const GLProgramHandle &handle, int layout)
 
- Protected Attributes inherited from CSE::SRenderGroup
const RenderMgrm_renderMgr
 

Detailed Description

This class is responsible for deferred rendering of G-Buffer objects.

Definition at line 15 of file DeferredRenderGroup.h.

Constructor & Destructor Documentation

◆ DeferredRenderGroup()

DeferredRenderGroup::DeferredRenderGroup ( const RenderMgr & renderMgr)
explicit

Constructor for DeferredRenderGroup

Parameters
renderMgrReference to the RenderMgr object.

Definition at line 15 of file DeferredRenderGroup.cpp.

15 : SRenderGroup(renderMgr) {
16 m_width = renderMgr.GetWidth();
17 m_height = renderMgr.GetHeight();
18
19 m_lightMgr = CORE->GetCore(LightMgr);
20}
unsigned int * GetWidth() const
Get the width of the screen.
Definition RenderMgr.h:53
unsigned int * GetHeight() const
Get the height of the screen.
Definition RenderMgr.h:62

References CSE::RenderMgr::GetHeight(), and CSE::RenderMgr::GetWidth().

Member Function Documentation

◆ Exterminate()

void DeferredRenderGroup::Exterminate ( )
overridevirtual

Free all allocated resources.

Implements CSE::SRenderGroup.

Definition at line 154 of file DeferredRenderGroup.cpp.

154 {
155 for (auto gbuffer_pair : m_gbufferLayer) {
156 auto gbuffer = gbuffer_pair.second;
157 SAFE_DELETE(gbuffer);
158 }
159 m_gbufferLayer.clear();
160}

◆ RegisterObject()

void DeferredRenderGroup::RegisterObject ( SIRender * object)
overridevirtual

Register an object to the render group.

Parameters
objectA pointer to the object to be registered.

Implements CSE::SRenderGroup.

Definition at line 24 of file DeferredRenderGroup.cpp.

24 {
25 const auto& material = object->GetMaterialReference();
26 const auto& shaders = material->GetShaders();
27 if (shaders == nullptr) return;
28 auto* handle = const_cast<GLProgramHandle*>(shaders->GetHandle("deferred"));
29
30 auto gbuffer = m_gbufferLayer[shaders];
31 if (!gbuffer) {
32 gbuffer = new SGBuffer();
33 gbuffer->GenerateGBuffer(*m_width, *m_height);
34 m_gbufferLayer[shaders] = gbuffer;
35 }
36 gbuffer->PushBackToLayer(object);
37 gbuffer->BindLightPass(handle);
38}

◆ RemoveObjects()

void DeferredRenderGroup::RemoveObjects ( SIRender * object)
overridevirtual

Remove an object from the render group.

Parameters
objectA pointer to the object to be removed.

Implements CSE::SRenderGroup.

Definition at line 40 of file DeferredRenderGroup.cpp.

40 {
41 const auto& material = object->GetMaterialReference();
42 const auto& programLayer = m_gbufferLayer;
43 auto it = std::find_if(programLayer.begin(), programLayer.end(), [&material](const auto& elem) {
44 return elem.first == material->GetShaders();
45 });
46 if (it != programLayer.end()) {
47 it->second->RemoveToLayer(object);
48 }
49}

◆ RenderAll()

void DeferredRenderGroup::RenderAll ( const CameraBase & camera) const
overridevirtual

Deferred rendering for each G-Buffer object.

Parameters
cameraStructure containing information values of the camera to be drawn.

Implements CSE::SRenderGroup.

Definition at line 51 of file DeferredRenderGroup.cpp.

51 {
52 for (const auto& gbuffer_pair : m_gbufferLayer) {
53 const auto& shaders = gbuffer_pair.first;
54 const auto& gbuffer = gbuffer_pair.second;
55 RenderGbuffer(camera, *gbuffer, *shaders);
56 }
57}
void RenderGbuffer(const CameraBase &camera, const SGBuffer &gbuffer, const SShaderGroup &shaders) const

References RenderGbuffer().

◆ RenderGbuffer()

void DeferredRenderGroup::RenderGbuffer ( const CameraBase & camera,
const SGBuffer & gbuffer,
const SShaderGroup & shaders ) const

Deferred rendering for each G-Buffer object.

Parameters
cameraStructure containing information values of the camera to be drawn.
gbufferG-Buffer object to be drawn.

======================

  1. Geometry Pass

======================

  1. Light Pass

======================

  1. Blit the depth buffer

Definition at line 60 of file DeferredRenderGroup.cpp.

61 {
62 const auto cameraMatrix = camera.GetCameraMatrixStruct();
63 const auto& frameBuffer = camera.GetFrameBuffer();
64 const bool hasFrameBuffer = frameBuffer != nullptr;
65 const auto& lightPassHandle = gbuffer.GetLightPassHandle();
66
67 const int bufferWidth = hasFrameBuffer ? frameBuffer->GetWidth() : (int) *m_width;
68 const int bufferHeight = hasFrameBuffer ? frameBuffer->GetHeight() : (int) *m_height;
69
73 gbuffer.AttachGeometryFrameBuffer();
74 glViewport(0, 0, *m_width, *m_height);
75 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
76 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
77 const auto& renderLayer = gbuffer.GetRendersLayer();
78 const auto& handle = shaders.GetGeometryHandle();
79 glUseProgram(handle->Program);
80
81 if (handle->CullFace == 0) {
82 glDisable(GL_CULL_FACE);
83 }else {
84 glEnable(GL_CULL_FACE);
85 glCullFace(handle->CullFace);
86 }
87
88 for (const auto& render : renderLayer) {
89 if (render == nullptr) continue;
90 if (!render->isRenderActive) continue;
91
92 const auto& material = render->GetMaterial();
93 material->AttachElement(0);
94 render->SetMatrix(cameraMatrix, handle);
95 render->Render(handle);
96 }
97
101 const auto& deferredBuffer =
102 frameBuffer == nullptr ? m_renderMgr->GetMainBuffer() : frameBuffer;
103 deferredBuffer->AttachFrameBuffer();
104 gbuffer.AttachLightPass();
105 //Attach Light
106 int layoutBegin = m_lightMgr->AttachLightToShader(lightPassHandle);
107 layoutBegin += m_lightMgr->AttachLightMapToShader(lightPassHandle, layoutBegin);
108#ifdef CSE_SETTINGS_RENDER_SDFGI_SUPPORT
109 {
110 m_renderMgr->BindSdfMapUniforms(*lightPassHandle);
111 layoutBegin += m_renderMgr->BindSdfMapTextures(*lightPassHandle, layoutBegin);
112 }
113#endif
114 if (lightPassHandle->CullFace == 0) {
115 glDisable(GL_CULL_FACE);
116 }else {
117 glEnable(GL_CULL_FACE);
118 glCullFace(lightPassHandle->CullFace);
119 }
120
121 gbuffer.AttachLightPassTexture(layoutBegin);
122 BindSourceBuffer(*deferredBuffer, *lightPassHandle, layoutBegin + 3);
123
124 ShaderUtil::BindCameraToShader(*lightPassHandle, cameraMatrix.camera, cameraMatrix.cameraPosition,
125 cameraMatrix.projection, cameraMatrix.camera);
126 gbuffer.RenderLightPass();
127
131// if (frameBuffer == nullptr) {
132// m_renderMgr->GetMainBuffer()->BlitFrameBuffer(*deferredBuffer);
133// } else {
134// frameBuffer->BlitFrameBuffer(*deferredBuffer);
135// }
136// gbuffer.AttachGeometryFrameBuffer(GL_READ_FRAMEBUFFER);
137// if(frameBuffer == nullptr) {
138// GetMainBuffer()->AttachFrameBuffer(GL_DRAW_FRAMEBUFFER);
139// }
140// else {
141// frameBuffer->AttachFrameBuffer(GL_DRAW_FRAMEBUFFER);
142// }
143//
144// glBlitFramebuffer(0, 0, *m_width, *m_height, 0, 0, bufferWidth, bufferHeight, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
145}
int AttachLightMapToShader(const GLProgramHandle *handle, int textureLayout) const
Definition LightMgr.cpp:47
int AttachLightToShader(const GLProgramHandle *handle) const
Definition LightMgr.cpp:15
static void BindSourceBuffer(const SFrameBuffer &buffer, const GLProgramHandle &handle, int layout)
static void BindCameraToShader(const GLProgramHandle &handle, const mat4 &camera, const vec3 &cameraPosition, const mat4 &projection, const mat4 &transform)
Binds the camera data to the shader.

References CSE::LightMgr::AttachLightMapToShader(), CSE::LightMgr::AttachLightToShader(), CSE::ShaderUtil::BindCameraToShader(), and CSE::SRenderGroup::BindSourceBuffer().

Referenced by RenderAll().

◆ SetViewport()

void DeferredRenderGroup::SetViewport ( )

Set the viewport size.

Definition at line 147 of file DeferredRenderGroup.cpp.

147 {
148 for (const auto& gbufferPair : m_gbufferLayer) {
149 const auto& gbuffer = gbufferPair.second;
150 gbuffer->ResizeGBuffer((int) *m_width, (int) *m_height);
151 }
152}

The documentation for this class was generated from the following files: