virtual void RenderSceneCB() { m_pGameCamera->OnRender(); m_pipeline.SetCamera(*m_pGameCamera); GeometryPass(); SSAOPass(); BlurPass(); LightingPass(); RenderFPS(); CalcFPS(); OgldevBackendSwapBuffers(); }
void OGL_DeferredRenderer::Render(const Scene* _scene) { glDisable(GL_BLEND); glEnable(GL_TEXTURE_2D); glEnable(GL_FRAMEBUFFER_SRGB); glDepthFunc(GL_LEQUAL); { int unhandledErrorCount = OGL_ErrorLog::ClearErrorStack(); if (unhandledErrorCount > 0) LOG_WARNING(std::to_string(unhandledErrorCount) + " GL errors were unhandled during the last frame."); } // Get Camera from scene Camera* camera = _scene->MainCamera(); Transform cameraTransform = camera->getNode()->WorldTransform(); SetViewport(camera); LoadPVMatrices(camera); // GEOMETRY PASS // DEPTH // STENCIL { m_Framebuffer.Bind(); m_Framebuffer.ActivateColorAttachments({ "Position", "Normal", "DiffuseSpec" }); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); glEnable(GL_STENCIL_TEST); glStencilMask(0xff); glStencilFunc(GL_ALWAYS, 0xf0, 0xff); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glClearColor(0.f, 0.f, 0.f, 1.f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); const RenderObjectMap_t& renderObjectsMap = _scene->RenderObjectsMap(); for (auto& pair : renderObjectsMap) { OGL_RenderObject* object = reinterpret_cast<OGL_RenderObject*>(pair.second); for(auto& mesh : object->Meshes()) mesh.SetShader(&m_GeometryPass); pair.second->Render(); } } // LIGHTING PASS // NO DEPTH // NO STENCIL { m_Framebuffer.ActivateColorAttachments({ "PostLighting" }); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glDisable(GL_STENCIL_TEST); LightingPass(_scene->LightsMap(), cameraTransform, { "Position", "Normal", "DiffuseSpec" }); } // BACKGROUND PASS // NO DEPTH // STENCIL { glEnable(GL_STENCIL_TEST); glStencilFunc(GL_NOTEQUAL, 0xf0, 0xff); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); ISkybox* sky = _scene->Skybox(); if (sky) sky->Render(); else { Vec3 color(0.23f, 0.45f, 0.67f); m_SolidBackgroundPass.EnableShader(); glUniform3fv(m_SolidBackgroundPass.GetUniform("u_Color"), 1, color.ToArray().get()); } glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); glUseProgram(0); } #ifdef _IMGUI ImGui::SliderFloat("Exposure", &g_Exposure, 0.001f, 10.f); #endif // FINAL PASS // NO DEPTH // NO STENCIL { glBindFramebuffer(GL_FRAMEBUFFER, 0); glDrawBuffer(GL_BACK); glDisable(GL_STENCIL_TEST); glEnable(GL_FRAMEBUFFER_SRGB); glClearColor(0.f, 0.f, 0.f, 1.f); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_Framebuffer.GetColorAttachment("PostLighting")->TargetName); m_QuadShader.EnableShader(); glUniform1i(m_QuadShader.GetUniform("u_Source"), 0); glUniform1f(m_QuadShader.GetUniform("u_Exposure"), g_Exposure); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glUseProgram(0); glBindTexture(GL_TEXTURE_2D, 0); } }