Skip to content
This repository was archived by the owner on Mar 21, 2025. It is now read-only.

Commit 6021a76

Browse files
committed
Support orthographic camera
1 parent 680cee6 commit 6021a76

File tree

1 file changed

+49
-16
lines changed

1 file changed

+49
-16
lines changed

Runtime/PerObjectShadow/ShadowCasterCullingArgs.cs

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2020
*/
2121

22+
using System.Runtime.CompilerServices;
2223
using Unity.Burst;
2324
using Unity.Mathematics;
2425
using UnityEngine;
@@ -68,29 +69,61 @@ internal unsafe struct ShadowCasterCullingArgs
6869

6970
public static void SetFrustumEightCorners(float4* frustumEightCorners, Camera camera)
7071
{
71-
const Camera.MonoOrStereoscopicEye Eye = Camera.MonoOrStereoscopicEye.Mono;
72+
Transform transform = camera.transform;
73+
float near = camera.nearClipPlane;
74+
float far = camera.farClipPlane;
7275

73-
// https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Camera.CalculateFrustumCorners.html
74-
// The order of the corners is lower left, upper left, upper right, lower right.
75-
76-
var viewport = new Rect(0, 0, 1, 1);
77-
Transform cameraTransform = camera.transform;
76+
if (camera.orthographic)
77+
{
78+
// Camera.CalculateFrustumCorners 不支持正交投影
7879

79-
camera.CalculateFrustumCorners(viewport, camera.nearClipPlane, Eye, s_FrustumCornerBuffer);
80+
// The orthographicSize is half the size of the vertical viewing volume.
81+
// The horizontal size of the viewing volume depends on the aspect ratio.
82+
float top = camera.orthographicSize;
83+
float right = top * camera.aspect;
8084

81-
for (int i = 0; i < 4; i++)
82-
{
83-
Vector3 xyz = cameraTransform.TransformPoint(s_FrustumCornerBuffer[i]);
84-
frustumEightCorners[i] = new float4(xyz, 1);
85+
// 顺序要和下一个分支里的一致
86+
frustumEightCorners[0] = TransformPoint(transform, -right, -top, near);
87+
frustumEightCorners[1] = TransformPoint(transform, -right, +top, near);
88+
frustumEightCorners[2] = TransformPoint(transform, +right, +top, near);
89+
frustumEightCorners[3] = TransformPoint(transform, +right, -top, near);
90+
frustumEightCorners[4] = TransformPoint(transform, -right, -top, far);
91+
frustumEightCorners[5] = TransformPoint(transform, -right, +top, far);
92+
frustumEightCorners[6] = TransformPoint(transform, +right, +top, far);
93+
frustumEightCorners[7] = TransformPoint(transform, +right, -top, far);
8594
}
95+
else
96+
{
97+
// https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Camera.CalculateFrustumCorners.html
98+
// The order of the corners is lower left, upper left, upper right, lower right.
8699

87-
camera.CalculateFrustumCorners(viewport, camera.farClipPlane, Eye, s_FrustumCornerBuffer);
100+
Rect viewport = new Rect(0, 0, 1, 1);
101+
const Camera.MonoOrStereoscopicEye eye = Camera.MonoOrStereoscopicEye.Mono;
88102

89-
for (int i = 0; i < 4; i++)
90-
{
91-
Vector3 xyz = cameraTransform.TransformPoint(s_FrustumCornerBuffer[i]);
92-
frustumEightCorners[i + 4] = new float4(xyz, 1);
103+
camera.CalculateFrustumCorners(viewport, near, eye, s_FrustumCornerBuffer);
104+
for (int i = 0; i < 4; i++)
105+
{
106+
frustumEightCorners[i] = TransformPoint(transform, s_FrustumCornerBuffer[i]);
107+
}
108+
109+
camera.CalculateFrustumCorners(viewport, far, eye, s_FrustumCornerBuffer);
110+
for (int i = 0; i < 4; i++)
111+
{
112+
frustumEightCorners[i + 4] = TransformPoint(transform, s_FrustumCornerBuffer[i]);
113+
}
93114
}
94115
}
116+
117+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
118+
private static float4 TransformPoint(Transform transform, float x, float y, float z)
119+
{
120+
return TransformPoint(transform, new Vector3(x, y, z));
121+
}
122+
123+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
124+
private static float4 TransformPoint(Transform transform, Vector3 point)
125+
{
126+
return new float4(transform.TransformPoint(point), 1);
127+
}
95128
}
96129
}

0 commit comments

Comments
 (0)