/// <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 ); } }
/// <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); } }