|
19 | 19 | * along with this program. If not, see <https://www.gnu.org/licenses/>.
|
20 | 20 | */
|
21 | 21 |
|
| 22 | +using System.Runtime.CompilerServices; |
22 | 23 | using Unity.Burst;
|
23 | 24 | using Unity.Mathematics;
|
24 | 25 | using UnityEngine;
|
@@ -68,29 +69,61 @@ internal unsafe struct ShadowCasterCullingArgs
|
68 | 69 |
|
69 | 70 | public static void SetFrustumEightCorners(float4* frustumEightCorners, Camera camera)
|
70 | 71 | {
|
71 |
| - const Camera.MonoOrStereoscopicEye Eye = Camera.MonoOrStereoscopicEye.Mono; |
| 72 | + Transform transform = camera.transform; |
| 73 | + float near = camera.nearClipPlane; |
| 74 | + float far = camera.farClipPlane; |
72 | 75 |
|
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 不支持正交投影 |
78 | 79 |
|
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; |
80 | 84 |
|
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); |
85 | 94 | }
|
| 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. |
86 | 99 |
|
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; |
88 | 102 |
|
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 | + } |
93 | 114 | }
|
94 | 115 | }
|
| 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 | + } |
95 | 128 | }
|
96 | 129 | }
|
0 commit comments