I have an off centre projection matrix in my game but while it works if the offset is on the x axis if there is any y offset then cascaded shadows get offset in the opposite direction, and example can be seen in the picture, can anyone offer a solution to fix this?

I have the same problem and I am using the PerspectiveOffCenter method found here http://unity3d.com/support/documentation/ScriptReference/Camera-projectionMatrix.html

Anyone have a solution?

I found a solution to this problem. You will need to calculate the aspect ratio and field of view before setting the new projection matrix.

Lets use the PerspectiveOffCenter example found here:

And extend it with code to calculate and set the aspect ratio and field of view:

``````using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class OffProjection : MonoBehaviour {
public float left = -0.2F;
public float right = 0.2F;
public float top = 0.2F;
public float bottom = -0.2F;

void LateUpdate() {
Camera cam = camera;
float width = (right - left);
float height = (top - bottom);
cam.aspect = width/height;
float fov = (Mathf.Atan(top/cam.nearClipPlane) - Mathf.Atan(bottom/cam.nearClipPlane)) * 57.2957795f;
cam.fieldOfView = fov;

Matrix4x4 m = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
cam.projectionMatrix = m;
}

static Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far) {
float x = 2.0F * near / (right - left);
float y = 2.0F * near / (top - bottom);
float a = (right + left) / (right - left);
float b = (top + bottom) / (top - bottom);
float c = -(far + near) / (far - near);
float d = -(2.0F * far * near) / (far - near);
float e = -1.0F;
Matrix4x4 m = new Matrix4x4();
m[0, 0] = x;
m[0, 1] = 0;
m[0, 2] = a;
m[0, 3] = 0;
m[1, 0] = 0;
m[1, 1] = y;
m[1, 2] = b;
m[1, 3] = 0;
m[2, 0] = 0;
m[2, 1] = 0;
m[2, 2] = c;
m[2, 3] = d;
m[3, 0] = 0;
m[3, 1] = 0;
m[3, 2] = e;
m[3, 3] = 0;
return m;
}
}
``````