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()); } }