void ShadowVolumeRenderPass::Draw(Camera * camera) { // Draw all layers with their materials uint32 size = (uint32)renderLayers.size(); DVASSERT(size == 1); RenderLayer * shadowVolumesLayer = renderLayers[0]; //Vector<LightNode*> & lights = renderSystem->GetLights(); uint32 renderBatchCount = shadowVolumesLayer->GetRenderBatchCount(); if(RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::SHADOWVOLUME_DRAW) && renderBatchCount > 0) { if(!shadowRect) { shadowRect = ShadowRect::Create(); } //2nd pass RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_CULL); RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_DEPTH_WRITE); RenderManager::Instance()->AppendState(RenderStateBlock::STATE_BLEND); RenderManager::Instance()->SetBlendMode(BLEND_ZERO, BLEND_ONE); RenderManager::Instance()->ClearStencilBuffer(0); RenderManager::Instance()->AppendState(RenderStateBlock::STATE_STENCIL_TEST); RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_ALWAYS); RenderManager::State()->SetStencilRef(1); RenderManager::State()->SetStencilMask(0xFFFFFFFF); RenderManager::State()->SetStencilPass(FACE_FRONT, STENCILOP_KEEP); RenderManager::State()->SetStencilFail(FACE_FRONT, STENCILOP_KEEP); RenderManager::State()->SetStencilZFail(FACE_FRONT, STENCILOP_DECR_WRAP); RenderManager::State()->SetStencilPass(FACE_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilFail(FACE_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilZFail(FACE_BACK, STENCILOP_INCR_WRAP); RenderManager::Instance()->FlushState(); shadowVolumesLayer->Draw(camera); //3rd pass RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_CULL); RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_DEPTH_TEST); RenderManager::State()->SetStencilRef(0); RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_NOTEQUAL); RenderManager::State()->SetStencilPass(FACE_FRONT_AND_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilZFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP); RenderManager::Instance()->SetBlendMode(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); shadowRect->Draw(); } }
void ShadowVolumeRenderPass::Draw(Camera * camera) { // Draw all layers with their materials uint32 size = (uint32)renderLayers.size(); DVASSERT(size == 1); RenderLayer * shadowVolumesLayer = renderLayers[0]; //Vector<LightNode*> & lights = renderSystem->GetLights(); uint32 renderBatchCount = shadowVolumesLayer->GetRenderBatchCount(); if(RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::SHADOWVOLUME_DRAW) && renderBatchCount > 0) { eBlendMode sFactor = RenderManager::Instance()->GetSrcBlend(); eBlendMode dFactor = RenderManager::Instance()->GetDestBlend(); //2nd pass RenderManager::Instance()->RemoveState(RenderState::STATE_CULL); RenderManager::Instance()->RemoveState(RenderState::STATE_DEPTH_WRITE); RenderManager::Instance()->AppendState(RenderState::STATE_BLEND); RenderManager::Instance()->SetBlendMode(BLEND_ZERO, BLEND_ONE); //RenderManager::Instance()->ClearStencilBuffer(0); //moved to per-frame clear RenderManager::Instance()->AppendState(RenderState::STATE_STENCIL_TEST); RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_ALWAYS); RenderManager::State()->SetStencilRef(1); RenderManager::State()->SetStencilMask(0x0000000F); RenderManager::State()->SetStencilPass(FACE_FRONT, STENCILOP_KEEP); RenderManager::State()->SetStencilFail(FACE_FRONT, STENCILOP_KEEP); RenderManager::State()->SetStencilZFail(FACE_FRONT, STENCILOP_DECR_WRAP); RenderManager::State()->SetStencilPass(FACE_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilFail(FACE_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilZFail(FACE_BACK, STENCILOP_INCR_WRAP); RenderManager::Instance()->FlushState(); shadowVolumesLayer->Draw(camera); //3rd pass RenderManager::Instance()->RemoveState(RenderState::STATE_CULL); RenderManager::Instance()->RemoveState(RenderState::STATE_DEPTH_TEST); RenderManager::State()->SetStencilRef(0); RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_NOTEQUAL); RenderManager::State()->SetStencilPass(FACE_FRONT_AND_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP); RenderManager::State()->SetStencilZFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP); switch(blendMode) { case MODE_BLEND_ALPHA: RenderManager::Instance()->SetBlendMode(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); break; case MODE_BLEND_MULTIPLY: RenderManager::Instance()->SetBlendMode(BLEND_DST_COLOR, BLEND_ZERO); break; default: break; } shadowRect->Draw(); RenderManager::Instance()->SetBlendMode(sFactor, dFactor); } }