开发平台:Tuanjie 1.6.8
开发设备:Pico4
环境参数
XR Plugin Management 4.0.0 (4.4.0 installed)
XR Interaction Toolkit 2.0.0 (3.2.1 installed)
XR Core Utilities 2.3.0(2.5.2 installed)
复现操作
- 访问
XR Interaction Toolkit示例场景 - 第一次运行正确。
- 第二次出现报错,且 XR设备画面未同步。
问题描述
IndexOutOfRangeException: renderPassIndex
UnityEngine.XR.XRDisplaySubsystem.GetRenderPass (System.Int32 renderPassIndex, UnityEngine.XR.XRDisplaySubsystem+XRRenderPass& renderPass) (at <25e0418db4c544128dffa64efb6155b6>:0)
UnityEngine.Experimental.Rendering.XRSystem.CreateDefaultLayout (UnityEngine.Camera camera) (at ./Library/PackageCache/com.unity.render-pipelines.core@14.1.0/Runtime/XR/XRSystem.cs:280)
UnityEngine.Experimental.Rendering.XRLayout.AddCamera (UnityEngine.Camera camera, System.Boolean enableXR) (at ./Library/PackageCache/com.unity.render-pipelines.core@14.1.0/Runtime/XR/XRLayout.cs:31)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderCameraStack (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera baseCamera) (at ./Library/PackageCache/com.unity.render-pipelines.universal@14.1.0/Runtime/UniversalRenderPipeline.cs:819)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.Render (UnityEngine.Rendering.ScriptableRenderContext renderContext, System.Collections.Generic.List`1[T] cameras) (at ./Library/PackageCache/com.unity.render-pipelines.universal@14.1.0/Runtime/UniversalRenderPipeline.cs:381)
UnityEngine.Rendering.RenderPipeline.InternalRender (UnityEngine.Rendering.ScriptableRenderContext context, System.Collections.Generic.List`1[T] cameras) (at <977369046ff24c3897731fb0252e62a3>:0)
UnityEngine.Rendering.RenderPipelineManager.DoRenderLoop_Internal (UnityEngine.Rendering.RenderPipelineAsset pipe, System.IntPtr loopPtr, UnityEngine.Object renderRequest, Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle safety) (at <977369046ff24c3897731fb0252e62a3>:0)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
指引 s_Display.GetRenderPass(renderPassIndex, out var renderPass) 为 NULL。即发生一次越界操作。
问题分析
问题源码如下:
for (int renderPassIndex = 0; renderPassIndex < s_Display.GetRenderPassCount(); ++renderPassIndex)
{
s_Display.GetRenderPass(renderPassIndex, out var renderPass);
...
}
即 GetRenderPassCount() 实际数超出 GetRenderPass() 范围。即有画面渲染未被统计。
文档 | XRDisplaySubsystem.cs
文档 | GetRenderPass.cs
文档 | GetRenderPassCount.cs
重启 Unity 工程后即解决问题,但重复二次仍出现该问题。考虑实际渲染应该是在 Pico 设备上进行。我留意到第一次运行时,除 Pico 设备外,Unity 自身的 Game 视窗也同时在渲染画面。于是发现了问题原因。
解决方法 | 禁用 Game - Scene 同屏在线布局
| Scene - Game | Game - Scene | Scene/Game |
|---|---|---|
![]() |
![]() |
![]() |
Scene-Game:从布局角度,应该是默认左上开始。因此Game布局在Scene后会造成问题发生。Game-Scene:将Game移动至首位即解决问题。Scene/Game:即使用单窗口则不影响。
猜测:可能是 Unity 的布局导致 GetRenderPassCount() 统计到 Game 窗口,但拿不到 renderPass 问题。


