void ForwardRenderer::renderWithZPrePass(IRenderContext* rc)
	{
		cullAll();
		Mat4f VP = m_pCamera->getProjectionMatrix() * m_pCamera->getViewMatrix();

		// Do Z Pre-Pass
		rc->enableColorBuffer(false, false, false, false);
		rc->enableDepthBuffer(true);
		rc->clear(IRenderContext::DEPTH);
		rc->setDepthTest(IRenderContext::DepthTestValue::Less);
		rc->setDrawMode(IRenderContext::DrawMode::Fill);
		m_pZPrePassShader->use();
		for (auto& e : m_entitiesCulled) // TODO: front-to-back order
		{
			Mat4f MVP = VP * e->getModelMatrix();
			Platform::get()->curShaderProgram()->setUniformFloatMatrix4Array(m_prePassMVPHandle, 1, false,
					MVP.getDataPointer());
			rc->drawMesh(e->getMesh());
		}

		// Do color pass
		rc->enableColorBuffer(true, true, true, true);
		rc->enableDepthBuffer(false);
		rc->clear(IRenderContext::COLOR);
		rc->setDepthTest(IRenderContext::DepthTestValue::LessEqual);
		rc->setDrawMode(IRenderContext::DrawMode::Fill);
		for (auto& e : m_entitiesCulled) // TODO: ordered by material
		{
			e->setupUnique();
			e->setupMaterial();
			rc->drawMesh(e->getMesh());
		}

		// Render translucent objects in back-to-front order
		rc->enableDepthBuffer(true);
		for (auto& e : m_translucentEntitiesCulled) // TODO: order
		{
			e->setupUnique();
			e->setupMaterial();
			rc->drawMesh(e->getMesh());
		}
	}