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

相关推荐
真鬼1232 天前
【Unity WebGL】内嵌网页与双向通信
unity·游戏引擎·webgl
zyh______2 天前
C#语法糖(按照实用性排序)
unity·c#
avi91112 天前
[AI教做人]CinemachineCamera 各项调整配置参数入门 + Profiler
unity·游戏开发·camera·cinemachine·visual camera·镜头配置
郝学胜-神的一滴3 天前
[简化版 GAMES 101] 计算机图形学 16:纹理走样、Mipmap、三线性插值、各向异性过滤原理全解
unity·游戏引擎·godot·图形渲染·three.js·opengl·unreal
吴梓穆4 天前
untiy TextMeshPro (TMP) text 操作 中文字符集 字体材质操作(添加纹理 添加描边 添加阴影)
unity
想你依然心痛4 天前
嵌入式单元测试:Unity/CMock框架与硬件在环测试——测试驱动、桩函数
unity·单元测试·游戏引擎
xcLeigh4 天前
Unity基础:Game视图详解——游戏预览、分辨率模拟与性能显示
游戏·unity·游戏引擎·音频·视频·game·play模式
xcLeigh4 天前
Unity基础:Scene视图操作完全指南——视角控制、物体选择与场景导航
unity·游戏引擎·scene·试图·场景导航
mxwin5 天前
Unity Shader exp 函数的算法与渲染应用
算法·unity·游戏引擎·shader
mxwin5 天前
Unity URP Exposure曝光原理与实战应用
unity·游戏引擎