Пример #1
0
        /// <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);
            }
        }
Пример #2
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);
                }
            }
        }