Example #1
0
    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);
	}
}