示例#1
0
文件: Scene.cpp 项目: mavaL/NeoEngine
	//------------------------------------------------------------------------------------
	void Scene::Enter()
	{
		g_env.pSceneMgr->ClearScene();

		if(!m_bSetup)
		{
			m_setupFunc(this);
			m_bSetup = true;
		}

		// Compute and store the scene aabb
		m_sceneAABB.SetNull();
		m_sceneShadowCasterAABB.SetNull();
		m_sceneShadowReceiverAABB.SetNull();

		for (size_t i=0; i<m_lstEntity.size(); ++i)
		{
			Entity* pEntity = m_lstEntity[i];
			pEntity->UpdateAABB();
			m_sceneAABB.Merge(pEntity->GetWorldAABB());

			if (pEntity->GetCastShadow())
			{
				m_sceneShadowCasterAABB.Merge(pEntity->GetWorldAABB());
			}

			m_sceneShadowReceiverAABB.Merge(pEntity->GetWorldAABB());
		}

		m_enterFunc(this);
	}
示例#2
0
	//-------------------------------------------------------------------------------
	void SceneManager::RenderPipline(uint32 phaseFlag, Material* pMaterial)
	{
		//================================================================================
		/// Render sky
		//================================================================================
		if (m_pSky && phaseFlag&eRenderPhase_Sky)
		{
			m_pSky->Render();
		}

		//================================================================================
		/// Render terrain
		//================================================================================
		if (m_pTerrain && phaseFlag&eRenderPhase_Terrain)
		{
			m_pTerrain->Render(pMaterial);
		}
		else if (m_pTerrain && phaseFlag&eRenderPhase_ShadowMap)
		{
			m_pTerrain->Render(m_pTerrain->GetShadowMaterial());
		}

		//================================================================================
		/// Render SSAO map
		//================================================================================
		if (phaseFlag & eRenderPhase_SSAO)
		{
			m_pSSAO->Update();

			// Make use of early-Z
			D3D11_DEPTH_STENCIL_DESC& depthDesc = m_pRenderSystem->GetDepthStencilDesc();
			depthDesc.DepthFunc = D3D11_COMPARISON_EQUAL;
			depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
			m_pRenderSystem->SetDepthStencelState(depthDesc);
		}

		//================================================================================
		/// Render entities
		//================================================================================
		Scene::EntityList& lstEntity = m_pCurScene->GetEntityList();

		if (phaseFlag & eRenderPhase_Solid)
		{
			for (size_t i=0; i<lstEntity.size(); ++i)
			{
				lstEntity[i]->Render(pMaterial);
			}
		}
		else if (phaseFlag & eRenderPhase_ShadowMap)
		{
			for (size_t i=0; i<lstEntity.size(); ++i)
			{
				Entity* ent = lstEntity[i];
				if(ent->GetCastShadow())
					ent->Render();
			}
		}

		if (phaseFlag & eRenderPhase_SSAO)
		{
			D3D11_DEPTH_STENCIL_DESC& depthDesc = m_pRenderSystem->GetDepthStencilDesc();
			depthDesc.DepthFunc = D3D11_COMPARISON_LESS;
			depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
			m_pRenderSystem->SetDepthStencelState(depthDesc);
		}	
		
		//================================================================================
		/// Render water
		//================================================================================
		if (m_pWater && phaseFlag&eRenderPhase_Water)
		{
			m_pWater->Render();
		}

		//================================================================================
		/// Render UI
		//================================================================================
		if (phaseFlag & eRenderPhase_UI)
		{
			D3D11_DEPTH_STENCIL_DESC& depthDesc = m_pRenderSystem->GetDepthStencilDesc();
			depthDesc.DepthEnable = FALSE;
			depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
			m_pRenderSystem->SetDepthStencelState(depthDesc);

			char szBuf[64];
			sprintf_s(szBuf, sizeof(szBuf), "lastFPS : %f", g_env.pFrameStat->lastFPS);
			m_pRenderSystem->DrawText(szBuf, IPOINT(10,10), Neo::SColor::YELLOW);

			// Debug RT
			if (m_debugRT == eDebugRT_SSAO)
			{
				m_pDebugRTMesh->Render();
			}
			else if (m_debugRT == eDebugRT_ShadowMap)
			{
				m_pDebugRTMesh->Render();
			}

			depthDesc.DepthEnable = TRUE;
			depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
			m_pRenderSystem->SetDepthStencelState(depthDesc);
		}
	}