/// <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="view"></param> /// <param name="projection"></param> /// <param name="depthBuffer"></param> /// <param name="hdrTarget"></param> /// <param name="diffuse"></param> /// <param name="specular"></param> /// <param name="normalMap"></param> public void RenderGBuffer(Matrix view, Matrix projection, DepthStencil2D depthBuffer, RenderTarget2D hdrTarget, RenderTarget2D diffuse, RenderTarget2D specular, RenderTarget2D normals) { if (surfaceShader == null) { return; } var device = Game.GraphicsDevice; device.ResetStates(); var cbData = new CBSurfaceData(); var viewPosition = Matrix.Invert(view).TranslationVector; var worldMatricies = new Matrix[scene.Nodes.Count]; scene.CopyAbsoluteTransformsTo(worldMatricies); device.SetTargets(depthBuffer.Surface, hdrTarget.Surface, diffuse.Surface, specular.Surface, normals.Surface); device.PipelineState = factory[(int)SurfaceFlags.GBUFFER]; 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.Projection = projection; cbData.View = view; cbData.World = worldMatricies[i]; cbData.ViewPos = new Vector4(viewPosition, 0); constBuffer.SetData(cbData); device.PixelShaderConstants[0] = constBuffer; device.VertexShaderConstants[0] = constBuffer; device.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap; device.SetupVertexInput(vertexBuffers[node.MeshIndex], indexBuffers[node.MeshIndex]); foreach (var subset in mesh.Subsets) { var surf = surfaceProps[subset.MaterialIndex]; device.PixelShaderResources[0] = surf.Diffuse; device.PixelShaderResources[1] = surf.Specular; device.PixelShaderResources[2] = surf.NormalMap; device.PixelShaderResources[3] = surf.Emission; device.DrawIndexed(subset.PrimitiveCount * 3, subset.StartPrimitive * 3, 0); } } }