暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

XRSubsystemTests.cs 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #if ENABLE_VR && ENABLE_XR_MODULE
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using NUnit.Framework;
  6. using UnityEngine;
  7. using UnityEngine.TestTools;
  8. using UnityEngine.Experimental.Rendering;
  9. using UnityEngine.XR;
  10. namespace UnityEngine.Rendering.Tests
  11. {
  12. class XRDisplaySubsystemCoreTests
  13. {
  14. // Utils
  15. protected IEnumerator WaitOneFrame()
  16. {
  17. yield return null;
  18. }
  19. Camera m_Camera;
  20. XRDisplaySubsystem m_XRDisplay;
  21. private RenderPipelineAsset m_RenderPipelineAsset;
  22. [SetUp]
  23. public void Setup()
  24. {
  25. var camObj = new GameObject();
  26. camObj.AddComponent<Camera>();
  27. m_Camera = camObj.GetComponent<Camera>();
  28. camObj.tag = "MainCamera";
  29. var displays = new List<XRDisplaySubsystem>();
  30. SubsystemManager.GetSubsystems(displays);
  31. // Skip tests
  32. if (displays.Count == 0)
  33. Assert.Ignore("No active XR provider found, skipping XRSystem core tests.");
  34. m_XRDisplay = displays[0];
  35. }
  36. [TearDown]
  37. public void TearDown()
  38. {
  39. if (m_Camera)
  40. {
  41. Object.Destroy(m_Camera.gameObject);
  42. }
  43. }
  44. [UnityTest]
  45. public IEnumerator SetOcclusionMeshScaleTest()
  46. {
  47. XRSRPSettings.occlusionMeshScale = 1.0f;
  48. yield return WaitOneFrame();
  49. // Set scale
  50. float targetScale = 0.5f;
  51. XRSRPSettings.occlusionMeshScale = targetScale;
  52. yield return WaitOneFrame();
  53. // Examine XRPass
  54. float occlusionScale = 0;
  55. var xrLayout = XRSystem.NewLayout();
  56. xrLayout.AddCamera(m_Camera, true);
  57. if (xrLayout.GetActivePasses().Count > 0)
  58. {
  59. (Camera _, XRPass xrPass) = xrLayout.GetActivePasses()[0];
  60. {
  61. occlusionScale = xrPass.occlusionMeshScale;
  62. }
  63. }
  64. Assert.AreEqual(targetScale, occlusionScale);
  65. yield return WaitOneFrame();
  66. // Reset to default 1.0f
  67. XRSRPSettings.occlusionMeshScale = 1.0f;
  68. yield return WaitOneFrame();
  69. }
  70. [UnityTest]
  71. public IEnumerator SetMirrorViewModeTest()
  72. {
  73. XRSRPSettings.mirrorViewMode = XRMirrorViewBlitMode.SideBySide;
  74. yield return WaitOneFrame();
  75. // Check XRDisplay mirror blit mode
  76. int mirrorBlitMode = m_XRDisplay.GetPreferredMirrorBlitMode();
  77. Assert.AreEqual(mirrorBlitMode, XRMirrorViewBlitMode.SideBySide);
  78. // Repeat for Left mode
  79. XRSRPSettings.mirrorViewMode = XRMirrorViewBlitMode.LeftEye;
  80. yield return WaitOneFrame();
  81. // Check XRDisplay mirror blit mode
  82. mirrorBlitMode = m_XRDisplay.GetPreferredMirrorBlitMode();
  83. Assert.AreEqual(mirrorBlitMode, XRMirrorViewBlitMode.LeftEye);
  84. }
  85. [UnityTest]
  86. public IEnumerator CalculateViewCornersTest()
  87. {
  88. yield return WaitOneFrame();
  89. // Retrieve XRPass
  90. var xrLayout = XRSystem.NewLayout();
  91. xrLayout.AddCamera(m_Camera, true);
  92. XRPass firstPass = XRSystem.emptyPass;
  93. if (xrLayout.GetActivePasses().Count > 0)
  94. {
  95. (Camera _, XRPass xrPass) = xrLayout.GetActivePasses()[0];
  96. {
  97. firstPass = xrPass;
  98. }
  99. }
  100. // z 0 case: all corners should be zero
  101. float z0 = 0;
  102. Vector3[] corners = CoreUtils.CalculateViewSpaceCorners(firstPass.GetProjMatrix(0), z0);
  103. Assert.AreEqual(Vector3.zero, corners[0]);
  104. Assert.AreEqual(Vector3.zero, corners[1]);
  105. Assert.AreEqual(Vector3.zero, corners[2]);
  106. Assert.AreEqual(Vector3.zero, corners[3]);
  107. // z2 corners = z1 corners * z2/z1
  108. float z1 = 1;
  109. float z2 = 2;
  110. Vector3[] cornersZ1 = CoreUtils.CalculateViewSpaceCorners(firstPass.GetProjMatrix(0), z1 /*z*/);
  111. Vector3[] cornersZ2 = CoreUtils.CalculateViewSpaceCorners(firstPass.GetProjMatrix(0), z2 /*z*/);
  112. Assert.AreEqual(cornersZ1[0] * z2 / z1, cornersZ2[0]);
  113. Assert.AreEqual(cornersZ1[1] * z2 / z1, cornersZ2[1]);
  114. Assert.AreEqual(cornersZ1[2] * z2 / z1, cornersZ2[2]);
  115. Assert.AreEqual(cornersZ1[3] * z2 / z1, cornersZ2[3]);
  116. }
  117. }
  118. }
  119. #endif