This problem has been eating at me for a little while now, and it's extremely frustrating.
First off, let me begin with explaining the matrices I am using:
Unity calculates culling matrices incorrectly. From the matrix, it seems to generate the actual occlusion culling itself scaled proportionally to the projection matrix, at least when it comes to the near clipping plane. This can typically be fixed by simply calculating a new projection matrix with half the near clip plane distance, but my problem is unfortunately not that simple. I want to calculate an oblique culling matrix (that is, with the near plane not perpendicular to the camera), and this near-clip-doubling is making it impossible to do as no matter what method I use to calculate the matrix, it is proportionally incorrect. I cannot figure out how to counter-compute against the scaling being caused by Unity's incorrect calculation, as I am simply not familiar enough with linear algebra and matrix math to intuitively understand the problem.
Here is the code that is being used to calculate the oblique matrix
//clipPlane is a vector4 in camera space (direction + distance from camera)
Matrix4x4 CalculateObliqueOcclusion(Matrix4x4 projection, Vector4 clipPlane, float signSide) {
//signSide determines whether it is the near or the far clipping plane that moves to the clipPlane
Vector4 q = projection.inverse * new Vector4(
signSide,
signSide,
1.0f,
1.0f
);
Vector4 c = clipPlane * (2F / (Vector4.Dot(clipPlane, q)));
//Left/Right sizing
projection[2] = c.x - projection[3];
//Top/Down sizing
projection[6] = c.y - projection[7];
//Near/Far clipping plane adjustment. Used to move far clipping plane.
projection[10] = (c.z - projection[11]);
//Scale adjustment- used to move near clipping plane
projection[14] = (c.w - projection[15]);
return projection;
}
Here is a video demonstrating the issue. the clipping plane is being generated correctly off of the object, but as you can see, the clipping matrix is wildly out of control.
