bool CScene::RenderShadow() { std::list<axelynx::Camera *>::const_iterator ci = camlist.begin(); std::list<axelynx::Camera *>::const_iterator ei = camlist.end(); CShadowPass::SetShadowShader(defShader_); CShadowPass::StartPass(); for(;ci!=ei;++ci) { if((*ci)->isEnabled()) { frame_++; (*ci)->Bind(zpassed?-1:0); CMaterial::Free(); //материал зависит от камеры if(zpassed) { CEarlyZ::StartRenderPass(); } else { glDepthFunc(GL_LESS); glDepthMask(GL_TRUE); } for(int i=0;i<256;++i) { if(visible_groups_[i]) scenegraph_[i]->Render(*ci); } (*ci)->UnBind(); CMaterial::Free(); //материал зависит от камеры } } CShader *cs = CShader::Current(); if(cs) cs->UnBind(); for(int i=0;i<16;++i) { CTexture *ct = CTexture::Current(i); if(ct) ct->UnBind(); } if(zpassed) CEarlyZ::EndRenderPass(); zpassed = false; glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDepthMask(GL_TRUE); CShadowPass::EndPass(); return true; }
bool CScene::ZPassRender() { std::list<axelynx::Camera *>::const_iterator ci = camlist.begin(); std::list<axelynx::Camera *>::const_iterator ei = camlist.end(); CEarlyZ::StartEarlyZPass(); for(;ci!=ei;++ci) { if((*ci)->isEnabled()) { frame_++; (*ci)->Bind(); CMaterial::Free(); //материал зависит от камеры OPENGL_CHECK_FOR_ERRORS(); for(int i=0;i<256;++i) { if(visible_groups_[i]) scenegraph_[i]->Render(*ci); } (*ci)->UnBind(); CMaterial::Free(); //материал зависит от камеры } } CShader *cs = CShader::Current(); if(cs) cs->UnBind(); for(int i=0;i<16;++i) { CTexture *ct = CTexture::Current(i); if(ct) ct->UnBind(); } CEarlyZ::EndEarlyZPass(); zpassed = true; return true; }