コード例 #1
0
ファイル: LightRenderer.cs プロジェクト: temik911/audio
        /// <summary>
        /// 
        /// </summary>
        /// <param name="?"></param>
        public void RenderShadows( Matrix view, Matrix projection, IShadowCaster shadowCaster )
        {
            if (Config.SkipShadows) {
                return;
            }

            Game.GraphicsDevice.ResetStates();

            if ( csmDepth.Height!=Config.CSMSize || spotDepth.Height!=Config.SpotShadowSize * 4) {
                CreateShadowMaps();
            }

            var device = Game.GraphicsDevice;

            device.Clear( csmDepth.Surface, 1, 0 );
            device.Clear( csmColor.Surface, Color4.White );

            Matrix[] shadowViews, shadowProjections;

            ComputeCSMMatricies( view, out shadowViews, out shadowProjections, out csmViewProjections );

            for (int i=0; i<4; i++) {

                var smSize = Config.CSMSize;
                var context = new ShadowRenderContext();
                context.ShadowView			=	shadowViews[i];
                context.ShadowProjection	=	shadowProjections[i];
                context.ShadowViewport		=	new Viewport( smSize * i, 0, smSize, smSize );
                context.FarDistance			=	1;
                context.SlopeBias			=	Config.CSMSlopeBias;
                context.DepthBias			=	Config.CSMDepthBias;
                context.ColorBuffer			=	csmColor.Surface;
                context.DepthBuffer			=	csmDepth.Surface;

                shadowCaster.RenderShadowMapCascade( context );
            }

            //
            //	Spot-Lights :
            //
            device.Clear( spotDepth.Surface, 1, 0 );
            device.Clear( spotColor.Surface, Color4.White );

            for (int i=0; i<spotLights.Count; i++) {

                var spot	= spotLights[i];
                var smSize	= Config.SpotShadowSize;
                var context = new ShadowRenderContext();
                var dx      = i % 4;
                var dy		= i / 4;
                var far		= spot.Projection.GetFarPlaneDistance();

                context.ShadowView			=	spot.SpotView;
                context.ShadowProjection	=	spot.Projection;
                context.ShadowViewport		=	new Viewport( smSize * dx, smSize * dy, smSize, smSize );
                context.FarDistance			=	far;
                context.SlopeBias			=	Config.SpotSlopeBias;
                context.DepthBias			=	Config.SpotDepthBias;
                context.ColorBuffer			=	spotColor.Surface;
                context.DepthBuffer			=	spotDepth.Surface;

                shadowCaster.RenderShadowMapCascade( context );
            }
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="?"></param>
        public void RenderShadows(Matrix view, Matrix projection, IShadowCaster shadowCaster)
        {
            if (Config.SkipShadows)
            {
                return;
            }

            Game.GraphicsDevice.ResetStates();

            if (csmDepth.Height != Config.CSMSize || spotDepth.Height != Config.SpotShadowSize * 4)
            {
                CreateShadowMaps();
            }

            var device = Game.GraphicsDevice;

            device.Clear(csmDepth.Surface, 1, 0);
            device.Clear(csmColor.Surface, Color4.White);

            Matrix[] shadowViews, shadowProjections;

            ComputeCSMMatricies(view, out shadowViews, out shadowProjections, out csmViewProjections);

            for (int i = 0; i < 4; i++)
            {
                var smSize  = Config.CSMSize;
                var context = new ShadowRenderContext();
                context.ShadowView       = shadowViews[i];
                context.ShadowProjection = shadowProjections[i];
                context.ShadowViewport   = new Viewport(smSize * i, 0, smSize, smSize);
                context.FarDistance      = 1;
                context.SlopeBias        = Config.CSMSlopeBias;
                context.DepthBias        = Config.CSMDepthBias;
                context.ColorBuffer      = csmColor.Surface;
                context.DepthBuffer      = csmDepth.Surface;

                shadowCaster.RenderShadowMapCascade(context);
            }


            //
            //	Spot-Lights :
            //
            device.Clear(spotDepth.Surface, 1, 0);
            device.Clear(spotColor.Surface, Color4.White);

            for (int i = 0; i < spotLights.Count; i++)
            {
                var spot    = spotLights[i];
                var smSize  = Config.SpotShadowSize;
                var context = new ShadowRenderContext();
                var dx      = i % 4;
                var dy      = i / 4;
                var far     = spot.Projection.GetFarPlaneDistance();

                context.ShadowView       = spot.SpotView;
                context.ShadowProjection = spot.Projection;
                context.ShadowViewport   = new Viewport(smSize * dx, smSize * dy, smSize, smSize);
                context.FarDistance      = far;
                context.SlopeBias        = Config.SpotSlopeBias;
                context.DepthBias        = Config.SpotDepthBias;
                context.ColorBuffer      = spotColor.Surface;
                context.DepthBuffer      = spotDepth.Surface;

                shadowCaster.RenderShadowMapCascade(context);
            }
        }