Unity 中的透视遮挡
更新时间: 2024年9月11日
有时,您希望自己的虚拟内容与用户周围的实际环境无缝融合。如果您有一个虚拟角色,您希望它遮住或遮挡其后面的真实世界对象,但您又希望该角色被其前面的真实世界对象所遮挡。透视 SDK 不提供开箱即用的此功能,该 SDK 的图层可以在应用图层后面渲染(
透视 AR 模式),也可以在应用图层前面渲染(当该图层的
位置设为
叠加时)。
针对在应用中实现可信的遮挡效果,Meta Quest 平台提供了几种方法。
从 Quest 3 开始,深度 API 可以为应用提供实时深度地图。借助这些信息,您可以实现逼真的动态遮挡,从而使真实世界对象可以在透视中遮掩虚拟对象。请参阅深度 API 的
遮挡功能,详细了解此功能以及如何将其纳入您的应用中。
深度 API 是一个功能强大的工具,但具有局限性。就 CPU 或 GPU 的使用率而言,此 API 会令您的应用耗费更多资源,或者您可能会对实时深度信息的延迟感到不满。如果需要对着色器作出一些更改,将此 API 纳入 Unity 项目中可能会很棘手。最后,您可能需要将遮挡用于旧版 Meta Quest 头戴设备,比如 Meta Quest 2。
如果您有权访问一个真实世界对象的几何形状和位置,您就可以用该对象来遮挡虚拟内容。例如,您可以使用被追踪的手来遮挡虚拟场景(如虚拟电灯开关),并将手显示为透视。
在其他对象之前(渲染队列 < 2000),使用仅写入深度缓冲区的材质渲染手部或遮挡物。后续虚拟对象或材质无法通过深度测试,不会在遮挡物区域渲染,给人一种位于遮挡物后面的错觉。
通过交替渲染 VR 对象和透视遮挡物以及通过使用 ZTest/ZWrite 着色器命令,可随意掌控透视与 VR 之间的分层复杂性。例如,可以在透视手部/手腕的顶部绘制一只虚拟手表,方法是将手表的 3D 模型渲染到更低的渲染队列中(这会遮挡手部的渲染),或在禁用 ZTest(使之忽略作为遮挡物的手)的情况下渲染该模型。
手部专用,还有旨在改善各种 MR 环境中手部互动的更多的解决方案。这些解决方案将互动 SDK 与透视结合使用,允许您根据特定互动类型调整手部的呈现形式。详情请参阅
手部的呈现形式。