Пример #1
0
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 );
    }
  }