void PrepareViewportForCascade(int splitIndex) { // Set the viewport for the current split Viewport splitViewport = new Viewport(); splitViewport.MinDepth = 0; splitViewport.MaxDepth = 1; splitViewport.Width = ShadowMapCascadeSize; splitViewport.Height = ShadowMapCascadeSize; splitViewport.X = splitIndex * ShadowMapCascadeSize; splitViewport.Y = 0; //Must be here because otherwise it crasher after resolution change MyRender.SetDeviceViewport(splitViewport); }
/// <summary> /// Renders a list of models to the shadow map, and returns a surface /// containing the shadow occlusion factor /// </summary> public void Render() { if (MyRender.Sun.Direction == Vector3.Zero) { return; } MyRender.GetRenderProfiler().StartProfilingBlock("MyShadowRenderer::Render"); if (MultiThreaded) { WaitUntilPrepareForDrawCompleted(); } else { //PrepareFrame(); PrepareCascadesForDraw(); } IssueQueriesForCascades(); MyRender.GetRenderProfiler().StartProfilingBlock("Set & Clear RT"); // Set our targets MyRender.SetRenderTarget(MyRender.GetRenderTarget(m_shadowRenderTarget), MyRender.GetRenderTarget(m_shadowDepthTarget)); MyRender.GraphicsDevice.Clear(ClearFlags.ZBuffer, new ColorBGRA(0.0f), 1.0f, 0); DepthStencilState.Default.Apply(); RasterizerState.CullNone.Apply(); //RasterizerState.CullCounterClockwise.Apply(); BlendState.Opaque.Apply(); MyRender.GetRenderProfiler().EndProfilingBlock(); MyRender.GetRenderProfiler().StartProfilingBlock("Render 4 ShadowMaps"); // Render our scene geometry to each split of the cascade for (int i = 0; i < NumSplits; i++) { if (m_skip[i]) { continue; } if (!m_visibility[i]) { continue; } RenderShadowMap(i); //IssueQueriesForShadowMap(i); } //Restore viewport MyRenderCamera.UpdateCamera(); MyRender.SetDeviceViewport(MyRenderCamera.Viewport); MyRender.GetRenderProfiler().EndProfilingBlock(); // MyGuiManager.TakeScreenshot(); MyRender.TakeScreenshot("ShadowMap", MyRender.GetRenderTarget(m_shadowRenderTarget), MyEffectScreenshot.ScreenshotTechniqueEnum.Color); // Texture.ToFile(MyRender.GetRenderTarget(m_shadowRenderTarget), "c:\\test.dds", ImageFileFormat.Dds); MyRender.GetRenderProfiler().EndProfilingBlock(); }