Exemplo n.º 1
0
        public override IDAEDirectionalLightNode CreateDirectionalLightNode(string name, DAEVector4 color)
        {
            var light = new DirectionalLightNode();

            light.Name  = name;
            light.Color = GetColor4(color);
            return(light);
        }
Exemplo n.º 2
0
        public Vector4 PrepareProjection(SceneNode root, Matrix4 camSliceFrustumProjMatrix, CameraNode cam, DirectionalLightNode light)
        {
            CameraSliceFrustum.ProjectionMatrix = camSliceFrustumProjMatrix;
            CameraSliceFrustum.GetBoundingBox(cam.GetWorldTransform(root) ?? Matrix4.Identity, light.GetInverseWorldTransform(root) ?? Matrix4.Identity, _frustumBounding);
            CameraSliceFrustum.GetBoundingBox(_frustumMaxExtend);
            float size = (_frustumMaxExtend.Max.Value - _frustumMaxExtend.Min.Value).Length;

            float   worldUnitsPerTexel = size / RenderTarget.DepthStencilBuffer.Width;
            Vector3 min = _frustumBounding.Min.Value;

            min /= worldUnitsPerTexel;
            min  = new Vector3((float)System.Math.Floor(min.X), (float)System.Math.Floor(min.Y), (float)System.Math.Floor(min.Z));
            min *= worldUnitsPerTexel;

            LightFrustum.ProjectionMatrix = Matrix4.OrthoOffCenterRH(min.X, min.X + size, min.Y, min.Y + size, light.NearPlane, light.FarPlane);

            Vector4 shadowOffsetAndScale = new Vector4(
                (-0.5f - min.X),
                (-0.5f + min.Y + size),
                1 / size,
                1 / size);

            return(shadowOffsetAndScale);
        }