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); }