【解决】IndexOutOfRangeException: renderPassIndex

开发平台: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 问题。

相关推荐
黄思搏1 天前
基于标注平台数据的 Unity UI 自动化构建工作流设计与工程实践
ui·unity·蓝湖·vectoui
羊羊20351 天前
开发手札:Unity6000与Android交互
android·unity·android-studio
Sator12 天前
Unity AStarPath的踩坑点
unity
星河耀银海2 天前
Unity基础:摄像机Camera的参数设置与视角控制
unity·游戏引擎·lucene
星河耀银海2 天前
Unity基础:Transform组件的位移、旋转与缩放详解
unity·游戏引擎·lucene
海清河晏1113 天前
数据结构 | 单链表
数据结构·unity·dreamweaver
mxwin3 天前
Unity URP 下 MatCap 技术详解 无视光照环境的卡通与质感渲染方案
unity·游戏引擎
山檐雾4 天前
OctreeNode
unity·c#·八叉树
WarPigs4 天前
Unity协程返回值的解决方案
unity·游戏引擎
WarPigs5 天前
Unity单例笔记
unity·游戏引擎