private void RenderShadowMap(PointLight pointLight)
        {
            Matrix[] views = new Matrix[6];

            views[0] = Matrix.CreateLookAt(pointLight.Position, pointLight.Position + Vector3.Forward, Vector3.Up);
            views[1] = Matrix.CreateLookAt(pointLight.Position, pointLight.Position + Vector3.Backward, Vector3.Up);
            views[2] = Matrix.CreateLookAt(pointLight.Position, pointLight.Position + Vector3.Left, Vector3.Up);
            views[3] = Matrix.CreateLookAt(pointLight.Position, pointLight.Position + Vector3.Right, Vector3.Up);
            views[4] = Matrix.CreateLookAt(pointLight.Position, pointLight.Position + Vector3.Down, Vector3.Forward);
            views[5] = Matrix.CreateLookAt(pointLight.Position, pointLight.Position + Vector3.Up, Vector3.Backward);

            Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(90.0f), 1.0f, 0.1f, pointLight.Radius);

            this.DepthWriterEffect.Parameters["Projection"].SetValue(projection);
            this.DepthWriterEffect.Parameters["LightPosition"].SetValue(pointLight.Position);
            this.DepthWriterEffect.Parameters["DepthPrecision"].SetValue(pointLight.Radius);

            // Forward
            this.GraphicsDevice.SetRenderTarget(pointLight.ShadowMap, CubeMapFace.PositiveZ);
            this.GraphicsDevice.Clear(Color.Transparent);
            this.DepthWriterEffect.Parameters["View"].SetValue(views[0]);
            this.RenderSceneForShadows();

            // Backward
            this.GraphicsDevice.SetRenderTarget(pointLight.ShadowMap, CubeMapFace.NegativeZ);
            this.GraphicsDevice.Clear(Color.Transparent);
            this.DepthWriterEffect.Parameters["View"].SetValue(views[1]);
            this.RenderSceneForShadows();

            // Left
            this.GraphicsDevice.SetRenderTarget(pointLight.ShadowMap, CubeMapFace.NegativeX);
            this.GraphicsDevice.Clear(Color.Transparent);
            this.DepthWriterEffect.Parameters["View"].SetValue(views[2]);
            this.RenderSceneForShadows();

            // Right
            this.GraphicsDevice.SetRenderTarget(pointLight.ShadowMap, CubeMapFace.PositiveX);
            this.GraphicsDevice.Clear(Color.Transparent);
            this.DepthWriterEffect.Parameters["View"].SetValue(views[3]);
            this.RenderSceneForShadows();

            // Down
            this.GraphicsDevice.SetRenderTarget(pointLight.ShadowMap, CubeMapFace.NegativeY);
            this.GraphicsDevice.Clear(Color.Transparent);
            this.DepthWriterEffect.Parameters["View"].SetValue(views[4]);
            this.RenderSceneForShadows();

            // Up
            this.GraphicsDevice.SetRenderTarget(pointLight.ShadowMap, CubeMapFace.PositiveY);
            this.GraphicsDevice.Clear(Color.Transparent);
            this.DepthWriterEffect.Parameters["View"].SetValue(views[5]);
            this.RenderSceneForShadows();
        }
Exemplo n.º 2
0
        /// <summary>
        /// Parses a <see cref="PointLight" /> from the given XML node.
        /// </summary>
        /// <param name="node">The XML node.</param>
        /// <returns>A <see cref="SceneNode" /> instance.</returns>
        public SceneNode ParsePointLight(XElement node)
        {
            var pointLight = new PointLight(
                this.ParseVector3(node.Element("position")),
                Quaternion.Identity,
                Vector3.One,
                float.Parse(node.Attribute("radius").Value),
                this.ParseColor(node.Element("color")),
                float.Parse(node.Attribute("intensity").Value),
                bool.Parse(node.Attribute("cast-shadows").Value),
                int.Parse(node.Attribute("resolution").Value),
                float.Parse(node.Attribute("bias").Value));

            var sceneNode = new SceneNode();
            sceneNode.AttachEntity(pointLight);
            return sceneNode;
        }