예제 #1
0
//--------------------------------------------------
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;
	}
}
예제 #2
0
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);
    }
  }
}