【解决】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 问题。

相关推荐
天人合一peng1 小时前
unity 生成标记根据背景色标记变色
unity·游戏引擎
天人合一peng5 小时前
unity 生成标记根据背景色变色为明显的颜色
unity·游戏引擎
魔士于安5 小时前
Unity 超市总动员 超市收银台 超市货架 超市购物手推车 超市常见商品
游戏·unity·游戏引擎·贴图·模型
CandyU26 小时前
Unity —— 数据持久化
unity·游戏引擎
zh路西法6 小时前
【Unity实现Oneshot胶卷显形】游戏窗口化与Win32API的使用
游戏·unity·游戏引擎
凡情10 小时前
android隐私合规检测
android·unity
小贺儿开发10 小时前
Unity3D 本地 Stable Diffusion 文生图效果演示
人工智能·unity·stable diffusion·文生图·ai绘画·本地化
mxwin1 天前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F1 天前
三层时间轮的实现
网络·unity·游戏引擎
咸鱼永不翻身1 天前
Lua脚本事件检查工具
unity·lua·工具