Esempio n. 1
0
        public static void MakeGlobalShadowMatrix(ref Camera camera, out Matrix globalShadowMatrix)
        {
            var cameraCb = camera.Constants;

            ResetFrustumCorners(ref _frustumCorners);
            var frustumCenter = DxVector3.Zero;
            for (int i = 0; i < 8; ++i)
            {
                DxVector3.TransformCoordinate(ref _frustumCorners[i], ref cameraCb.Data.InverseViewProjection,
                    out _frustumCorners[i]);
                DxVector3.Add(ref frustumCenter, ref _frustumCorners[i], out frustumCenter);
            }
            DxVector3.Divide(ref frustumCenter, 8.0f, out frustumCenter);

            var upDir = DxVector3.Up;

            var lightCameraPos = frustumCenter;
            DxVector3 lookAt;
            DxVector3.Subtract(ref frustumCenter, ref Direction, out lookAt);
            Matrix lightView;
            Matrix.LookAtLH(ref lightCameraPos, ref lookAt, ref upDir, out lightView);

            DxVector3 shadowCameraPos;
            //DxVector3.Multiply(ref Lighting.LightDirection, -0.5f, out shadowCameraPos);
            //DxVector3.Add(ref frustumCenter, ref shadowCameraPos, out shadowCameraPos);
            shadowCameraPos = frustumCenter + Direction * -0.5f;

            Matrix viewMatrix;
            Matrix projMatrix;
            Matrix viewProjMatrix;
            Matrix.OrthoOffCenterLH(-0.5f, 0.5f, -0.5f, 0.5f, 0.0f, 1.0f, out projMatrix);
            Matrix.LookAtLH(ref shadowCameraPos, ref frustumCenter, ref upDir, out viewMatrix);
            Matrix.Multiply(ref viewMatrix, ref projMatrix, out viewProjMatrix);

            Matrix.Multiply(ref viewProjMatrix, ref _texScaleBias, out globalShadowMatrix);
        }