MaterialPtr PGSampleApp::buildDepthShadowMaterial(const String& textureName) { String matName = "DepthShadows/" + textureName; #if OGRE_VERSION_MAJOR <= 1 #if OGRE_VERSION_MINOR <= 8 MaterialPtr ret = MaterialManager::getSingleton().getByName(matName); #else MaterialPtr ret = MaterialManager::getSingleton().getByName(matName); #endif #endif if (ret.isNull()) { #if OGRE_VERSION_MAJOR <= 1 #if OGRE_VERSION_MINOR <= 8 MaterialPtr baseMat = MaterialManager::getSingleton().getByName("Ogre/shadow/depth/integrated/pssm"); #else MaterialPtr baseMat = MaterialManager::getSingleton().getByName("Ogre/shadow/depth/integrated/pssm").staticCast<Material>(); #endif #endif ret = baseMat->clone(matName); Pass* p = ret->getTechnique(0)->getPass(0); p->getTextureUnitState("diffuse")->setTextureName(textureName); Vector4 splitPoints; const PSSMShadowCameraSetup::SplitPointList& splitPointList = static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints(); for (int i = 0; i < 3; ++i) { splitPoints[i] = splitPointList[i]; } p->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints", splitPoints); } return ret; }
void configureShadows( bool enabled, bool depthShadows ) { TerrainMaterialGeneratorA::SM2Profile* matProfile = static_cast<TerrainMaterialGeneratorA::SM2Profile*>(mTerrainGlobals->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled( enabled ); #ifdef SHADOWS_IN_LOW_LOD_MATERIAL matProfile->setReceiveDynamicShadowsLowLod( true ); #else matProfile->setReceiveDynamicShadowsLowLod( false ); #endif // Default materials for( EntityList::iterator i = mHouseList.begin(); i != mHouseList.end(); ++i ) { (*i)->setMaterialName( "Examples/TudorHouse" ); } if( enabled ) {// General scene setup mSceneMgr->setShadowTechnique( SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED ); mSceneMgr->setShadowFarDistance( 3000 ); // 3 textures per directional light (PSSM) mSceneMgr->setShadowTextureCountPerLightType( Ogre::Light::LT_DIRECTIONAL, 3 ); if( mPSSMSetup.isNull() ) {// shadow camera setup PSSMShadowCameraSetup* pssmSetup = new PSSMShadowCameraSetup(); pssmSetup->setSplitPadding( mCamera->getNearClipDistance() ); pssmSetup->calculateSplitPoints( 3, mCamera->getNearClipDistance(), mSceneMgr->getShadowFarDistance() ); pssmSetup->setOptimalAdjustFactor( 0, 2 ); pssmSetup->setOptimalAdjustFactor( 1, 1 ); pssmSetup->setOptimalAdjustFactor( 2, 0.5 ); mPSSMSetup.bind( pssmSetup ); } mSceneMgr->setShadowCameraSetup( mPSSMSetup ); if( depthShadows ) { mSceneMgr->setShadowTextureCount( 3 ); mSceneMgr->setShadowTextureConfig( 0, 2048, 2048, PF_FLOAT32_R ); mSceneMgr->setShadowTextureConfig( 1, 1024, 1024, PF_FLOAT32_R ); mSceneMgr->setShadowTextureConfig( 2, 1024, 1024, PF_FLOAT32_R ); mSceneMgr->setShadowTextureSelfShadow( true ); mSceneMgr->setShadowCasterRenderBackFaces( true ); MaterialPtr houseMat = buildDepthShadowMaterial( "fw12b.jpg" ); for( EntityList::iterator i = mHouseList.begin(); i != mHouseList.end(); ++i ) { (*i)->setMaterial( houseMat ); } } else { mSceneMgr->setShadowTextureCount( 3 ); mSceneMgr->setShadowTextureConfig( 0, 2048, 2048, PF_X8B8G8R8 ); mSceneMgr->setShadowTextureConfig( 1, 1024, 1024, PF_X8B8G8R8 ); mSceneMgr->setShadowTextureConfig( 2, 1024, 1024, PF_X8B8G8R8 ); mSceneMgr->setShadowTextureSelfShadow( false ); mSceneMgr->setShadowCasterRenderBackFaces( false ); mSceneMgr->setShadowTextureCasterMaterial( StringUtil::BLANK ); } matProfile->setReceiveDynamicShadowsDepth( depthShadows ); matProfile->setReceiveDynamicShadowsPSSM( static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get()) ); //addTextureShadowDebugOverlay(TL_RIGHT, 3); } else { mSceneMgr->setShadowTechnique( SHADOWTYPE_NONE ); } }