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

相关推荐
玖玥拾19 小时前
Lua 基础语法(二)
开发语言·unity·lua
玖玥拾1 天前
Lua 基础语法(三) 元表 metatable、元方法、模拟面向对象
开发语言·unity·lua
谢斯3 天前
[unity]如何在unity中添加newtonsoft-json
unity·json·游戏引擎
天人合一peng3 天前
Unity标记固定颜色及投影标记
unity
云雨巫山3 天前
Unity 游戏开发性能优化全景手册
unity·智能手机·性能优化·游戏引擎
maybeyaluokenai3 天前
unity build in渲染管线概述
unity·图形渲染
云雨巫山3 天前
Unity 性能优化 · 图解全景手册
unity·性能优化·游戏引擎
Madokaly4 天前
DOTween的Vector3Plugin
unity
一梭键盘任平生4 天前
Shader入门笔记2
unity
点心的游戏开发世界4 天前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#