/// <summary> /// /// </summary> /// <param name="shadowView"></param> /// <param name="shadowProjection"></param> /// <param name="depthBuffer"></param> public void RenderShadowMapCascade(LightRenderer.ShadowRenderContext shadowRenderCtxt) { if (surfaceShader == null) { return; } var device = Game.GraphicsDevice; var cbData = new CBSurfaceData(); var viewPosition = Matrix.Invert(shadowRenderCtxt.ShadowView).TranslationVector; var worldMatricies = new Matrix[scene.Nodes.Count]; scene.CopyAbsoluteTransformsTo(worldMatricies); device.SetTargets(shadowRenderCtxt.DepthBuffer, shadowRenderCtxt.ColorBuffer); device.SetViewport(shadowRenderCtxt.ShadowViewport); device.PipelineState = factory[(int)SurfaceFlags.SHADOW]; device.PixelShaderConstants[0] = constBuffer; device.VertexShaderConstants[0] = constBuffer; device.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap; cbData.Projection = shadowRenderCtxt.ShadowProjection; cbData.View = shadowRenderCtxt.ShadowView; cbData.BiasSlopeFar = new Vector4(shadowRenderCtxt.DepthBias, shadowRenderCtxt.SlopeBias, shadowRenderCtxt.FarDistance, 0); for (int i = 0; i < scene.Nodes.Count; i++) { var node = scene.Nodes[i]; if (node.MeshIndex == -1) { continue; } var mesh = scene.Meshes[node.MeshIndex]; cbData.World = worldMatricies[i]; constBuffer.SetData(cbData); device.SetupVertexInput(vertexBuffers[node.MeshIndex], indexBuffers[node.MeshIndex]); device.DrawIndexed(mesh.IndexCount, 0, 0); } }
/// <summary> /// /// </summary> /// <param name="shadowView"></param> /// <param name="shadowProjection"></param> /// <param name="depthBuffer"></param> public void RenderShadowMapSpot(LightRenderer.ShadowRenderContext shadowRenderCtxt) { }