//-------------------------------------------------- void Scene::render() { static int frameCount = -1; // now update the cube map // because our scene is pretty much static, we need to do this // every couple of frames only // uncomment this if you implemented environment mapping frameCount = (frameCount + 1) % 500; if (frameCount == 0) { updateCubeMap(); } // switch (shadowMode) { default: renderNormal(); break; case 1: renderShadowVolumes(); break; case 2: case 3: renderShadowMapping(); break; } }
void Renderer::renderScene(Scene& scene, Window& window) { if (!m_ping || !m_pong) init(window.getWidth(), window.getHeight()); glClearColor(0.0, 0.0, 0.0, 1); if (m_useShadowMapping) renderShadowMapping(scene); m_firstRender = true; m_currentFBOIndex = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_gBuffer->bind(); m_shaderGBuffer->bind(); m_currentViewMatrix = scene.getScenegraph()->getActiveCamera()->getViewMatrix(); m_currentProjectionMatrix = scene.getScenegraph()->getActiveCamera()->getProjectionMatrix(); m_shaderGBuffer->sendMat4("viewMatrix", m_currentViewMatrix); m_shaderGBuffer->sendMat4("projectionMatrix", m_currentProjectionMatrix); //================== m_shaderGBuffer->sendInt("useShadowMap", m_useShadowMapping); if (m_useShadowMapping) { m_shaderGBuffer->sendInt("shadowMode", *m_pcf); m_shaderGBuffer->sendVec4("light.pos", m_smConeLight->m_position); m_shaderGBuffer->sendVec3("light.col", glm::vec3(m_smConeLight->m_color)); m_shaderGBuffer->sendVec3("light.spot_direction", m_smConeLight->m_direction); m_shaderGBuffer->sendFloat("light.spot_exponent", m_smConeLight->m_exponent); m_shaderGBuffer->sendFloat("light.spot_cutoff", m_smConeLight->m_radius); m_shaderGBuffer->sendVec3("lightAmbient", glm::fvec3(0.3f,0.3f,0.3f)); //Shadow mapping glm::mat4 lightPerspective, lightView, lightMVPBias; lightPerspective = m_smCam->getProjectionMatrix(); lightView = m_smCam->getViewMatrix(); glm::mat4 sm_lightViewport( 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0 ); //Build "shadow matrix" lightMVPBias = sm_lightViewport * lightPerspective * lightView; m_shaderGBuffer->sendMat4("lightVPBias", lightMVPBias); m_shaderGBuffer->sendVec3("mat.diffuse", darkgrey); m_shaderGBuffer->sendVec3("mat.specular", grey); m_shaderGBuffer->sendFloat("mat.shininess", 100.0f); m_shaderGBuffer->sendFloat("mat.alpha", 1.0f); //Bind and Pass shadow map. Only use SHADOW_TEXTURE_UNIT when Normal Mapping is applied. m_shaderGBuffer->sendSampler2D("depthTexture", m_smFBO->getDepthTexture(), 3); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (scene.hasSkybox()) { glDisable(GL_DEPTH_TEST); m_shaderGBuffer->sendSkyboxTexture("cubeMap", reinterpret_cast<Skybox*>(scene.getSkyboxNode()->getGeometry())->getSkyboxTexture(),4); m_shaderGBuffer->sendInt("renderSkybox", 1); scene.getSkyboxNode()->render(*m_shaderGBuffer); glEnable(GL_DEPTH_TEST); } m_shaderGBuffer->sendInt("renderSkybox", 0); scene.render(*m_shaderGBuffer); m_shaderGBuffer->unbind(); //renderParticleSystems scene.renderParticleSystems(); m_gBuffer->unbind(); if (m_useSSAO) renderSSAO(); if (m_useDeferredShading) renderDeferredShading(); if (m_useReflections) renderReflections(scene.getScenegraph()->getActiveCamera()->getNear(), scene.getScenegraph()->getActiveCamera()->getFar()); if (m_useBloom) renderBloom(); if (m_useBlur) renderBlur(); if (m_useRadialBlur) renderRadialBlur(); if (m_useDoF) renderDoF(scene); if (m_useAntiAliasing) renderAntiAliasing(); //Render SFQ m_shaderSFQ->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_shaderSFQ->sendSampler2D("texture", getLastFBO()->getColorTexture(2)); m_sfq.renderGeometry(); m_shaderSFQ->unbind(); if (m_guis.size() > 0) { for (std::vector<GUI*>::iterator it = m_guis.begin(); it != m_guis.end(); ++it) { (*it)->render(window); } } }