开发

使用 VR 合成器图层

更新时间: 2024年12月17日
本指南说明如何在 Unity 应用程序中实现合成器图层。要了解合成器图层如何运作以及如何调试它们,请参阅合成器图层
OVROverlay 是 Oculus/VR/Scripts 文件夹中启用合成器图层的脚本。
OVROverlay 在一个场景中支持最多 15 个图层。但每个场景不能包含超过一个圆柱和一个立方体图层。如果合成器图层渲染失败,只会回退到四边形,并将其作为场景几何体进行渲染。立方体图和圆柱完全不显示。一个常见的例子是在尝试渲染超过最大数量的合成器图层时。如需支持超过 15 个对象,可将平面元素组合成一个单一的 RenderTexture,并使用单一的 OVROverlay 图层。

添加叠加或底图

  1. 在 Unity 编辑器的层次结构视图中,创建一个空的游戏对象。
  2. 将 OVROverlay 脚本从 Packages/com.meta.xr.sdk.core/Scripts/OVROverlay.cs 拖至 GameObject。
    注意:OVROverlay 使用 OVRManager。
    The OVROverlay script

了解 OVROverlay 脚本配置

OVROverlay 脚本包含多项配置设置。

叠加类型

选择叠加类型。可用的选项是“叠加”、“底图”和“无”。
  • 叠加是默认类型。它在视觉缓冲区前面呈现。
  • 底图在视觉缓冲区后面呈现。底图合成图层对带宽的要求更高,因为合成器必须在视觉缓冲区中使用 Alpha 遮罩打出一个孔,才能让底图内容可见。纹理带宽常常是 VR 的瓶颈,因此请谨慎使用,并确保评估它们对您的应用程序的影响。
  • 将隐藏图层。

合成深度

合成深度是一项可选功能,默认禁用,可用于设置图层的深度。它用来确定场景中的图层排序。比较两个图层时,合成深度较小的悬窗/底图在合成深度较大的悬窗/底图前面合成。例如,具有多个悬窗和底图的场景将是 -
[相机] (图层) 2 / 1 / 0 [视觉缓冲区] -1 / 0 / 1 (底图)

启用深度缓冲测试

要为特定图层启用合成深度测试,请选中启用深度缓冲测试复选框。
此功能在加载或暂停屏幕悬窗等情况下很有用。如果在给定图层中没有启用此功能,您的 OVROverlay 图层将始终呈现在场景的顶部。
注意:即使某个对象在距离相机的远近上本应位于另一个物体的后面,但由于它是以悬窗的形式实现的,而您又选择忽略合成深度,因此它仍可能在前面绘制。这会给观众关于这些对象的深度提供相互矛盾的信息,让观众感到不适。

悬窗形状

选择悬窗图层的形状。
  • 四边形图层是具有四个顶点的平面纹理。最常用作一个窗口来显示场景中的文本或信息。
  • 立方体贴图图层是由六个正方形组成的纹理,它们形成一个立方体以包围一个物体。最常用于场景的反射和背景或环境。您也可以将它用于低开销加载或启动场景。有关立方体贴图的详细信息,请参阅立方体贴图截图页面。
  • 圆柱图层是将单个纹理以圆柱形式包裹在相机周围的纹理。最常用于曲线 UI 界面。
  • 等距图层是一种将单一纹理包裹到球体上,并投影到虚拟场景以环绕用户视野的图层形式。最常用于 360/180 度视频播放。
  • 偏离中心立方图图层的几何中心沿 Z 轴向前移动 30 度,以提高用户前方区域的保真度(即像素密度)。
  • 鱼眼设置 OVROverlay 显示鱼眼图像。您可以调整变换设置来改变鱼眼图层的视野 X (FovX)、视野 Y (FovY)、地平线 (Horizon) 和经线 (Meridian)。
    • 位置 X:调整鱼眼效果的经线。这是图像中心在水平方向上的右手偏移量,以度为单位。
    • 位置 Y:调整鱼眼效果的地平线。这是图像中心在垂直方向上的偏移量,以度为单位。
    • 比例 X:调整鱼眼效果的水平视场角 (FOV),以度为单位。
    • 比例 Y:调整鱼眼效果的垂直视场角 (FOV),以度为单位。
    • 旋转 X、Y、Z:分别调整图层的偏航角 (Yaw)、俯仰角 (Pitch) 和横滚角 (Roll)。

双三次插值滤波

您可以为 Meta Quest 显示启用 GPU 硬件双三次插值滤波,在呈现 VR 图像时享受额外的保真度。如果您正在为 Meta Quest 开发,系统将回退到默认的双线性插值,以便您可以使用双三次插值滤波功能,而无需为旧设备做特殊处理。
  • 要启用双三次插值滤波,请选中双三次插值滤波复选框。
注意:随着核函数占用空间的增加,双三次插值滤波需要更多的 GPU 资源。这在三线性缩小过滤中尤其如此,因为它需要从不同的 MIP 级别中进行两次双三次计算。如果直接在合成器图层中使用,增加的 GPU 成本将体现在合成时间上,这可能会导致掉帧,从而对 VR 体验产生负面影响。您应该权衡增加的视觉保真度和提供最佳 VR 用户体验所需的额外 GPU 资源。

合成图层过滤

为了提高合成图层的图像质量,请启用合成图层过滤。图层过滤方法支持针对 Quest 显示光学系统调整的超级采样。
启用超级采样(左)可以减少由合成器对图层进行下采样以匹配显示分辨率时,高对比度边缘(右)产生的闪烁。
Comparison showing supersampling reducing flicker on high contrast edges in a composition layer.
锐化可以提升高对比度边缘的清晰度,并可以在上采样以满足显示分辨率时抵消模糊。
Comparison showing sharpening improving clarity of high contrast edges in a composition layer.
通过启用自动过滤,可以在保持图层最高视觉质量的同时,防止屏幕撕裂等不良伪影。在此模式下,运行时仅当有益时才自动应用所选的超级采样和锐化滤波器。示例包括:
  • 应用锐化滤波器以减轻图层模糊。
  • 应用超级采样滤波器来减轻闪烁。
如果图层不需要任何过滤,那么选择自动过滤将不会执行任何操作,也不会产生性能开销。
自动过滤会考虑与图层的动态和复杂互动,例如图层大小调整和玩家在 3D 空间中的移动。此外,在过滤图层之前,它还会考虑以下参数:
  • 图层每度的渲染像素数。
  • 显示屏每度的硬件像素数。
  • GPU 利用率。
  • 图层可见度。
Auto filtering dynamically applying supersampling and sharpening based on layer conditions.

启用图层过滤

要启用超级采样或锐化,请从超级采样锐化下拉菜单中选择普通或昂贵的变体。昂贵的变体计算成本较高,只有在应用程序具有额外的 GPU 容量时才应使用。
重要:合成图层过滤需要更多 GPU 资源。这对于锐化和超级采样算法尤其如此,因为这些算法使用的核函数占用空间更大。如果直接将这些算法用于合成图层,则会增加对 GPU 资源的需求,这将对合成时间产生重要影响。这可能会导致掉帧,从而对 VR 体验产生负面影响。总而言之,在应用合成图层过滤时,您应该权衡增加的视觉保真度和提供最佳 VR 用户体验所需的额外 GPU 资源。或者,您可以使用自动过滤模式来降低不必要过滤的风险。在 GPU 资源受限的情况下,自动过滤将巧妙地降低窗口质量。

启用自动过滤

若要启用自动过滤,请选中自动过滤复选框,然后从过滤器下拉菜单中选择普通或昂贵的过滤器变体。例如,如果应用程序选择了锐化的昂贵变体和超级采样的普通变休,则自动过滤功能将仅在必要时使用所选的过滤器对图层进行过滤。

纹理

关联您希望在悬窗图层上渲染的纹理。如果您将其保留为默认选项,则将使用渲染器的材料主纹理(如果可用)。

动态纹理

选择悬窗图层上渲染的内容是否为动态内容,即悬窗图层存在时,纹理是否应该每帧都更新。当渲染纹理与图层关联时,此复选框将自动被选中。

是受保护的内容

如果选择此项,您将在 Rift 上使用 HDCP 保护图层,并在 Meta Quest 上使用 L1 Widevine DRM 保护图层。
对于 Meta Quest:要在头戴设备上启用支持功能,您还必须将 OVROverlay 图层渲染为外部表面,并在“播放器设置”>“虚拟现实”>“Oculus”中选择受保护的内容

是外部表面

选择是外部表面复选框来标识该图层将用于穿透外部 Android 表面的纹理或视频。
该功能允许创建 Android 表面且允许该界面由 Timewarp 图层管理。在 Unity 项目中,可创建一个四边形覆盖层,并直接将表面纹理渲染到 TimeWarp 图层。有关渲染表面纹理的更多信息,请参阅动画加载屏幕技术说明。
使用外表面宽度外表面高度定义输出的大小。
OVROverlay Inspector section with Is External Surface enabled and width and height fields.

使用默认矩形

选择圆柱或偏离中心立方图图层后,可定义一个由左右图片共同组成的单一输入纹理。将纹理设置为左纹理。不要为双眼设置相同的纹理。
取消勾选此复选框会打开源矩形对话框,您可在其中定义左右纹理在单一输入纹理中的定位方式。可快速选择“单视场”、“左/右立体声”和“上/下立体声”预设。
OVROverlay Source Rects settings showing left and right eye texture layout options.

覆盖颜色刻度

覆盖任何图层的全局颜色设置。选中覆盖颜色刻度复选框以设置颜色刻度颜色偏移输入。
OVROverlay Override Color Scale section with Color Scale and Color Offset fields.

使用底图

底图取决于渲染目标的 Alpha 通道。请执行以下操作以添加底图:
  1. 如果场景中的某个对象应该遮挡底图且完全不透明,则将颜色窗口中的 Alpha 值设置为 1。如果遮挡物是透明的(即 Alpha 值在 0 到 1 之间),则必须从 Packages/com.meta.xr.sdk.core/Resources/ 中使用 Underlay Transparent Occluder.shader
    注意:悬窗不需要对透明度进行任何特殊处理。
  2. 在所有对象都绘制到视觉缓冲区之后,在纹理上戳一个洞。
  3. Underlay Impostor.shader 中使用 Underlay Imposter.shader 在 delta 空间中绘制替代物。确保在所有不透明纹理绘制完成之后、但在 Alpha 处理之前执行此操作。这样可以使底图透过空白区域显示出来。

示例

在以下示例中,大部分场景几何体被渲染到视觉缓冲区。该应用程序在场景后添加了一个凝视光标作为四边形覆盖层,并添加了一个天空盒作为立方体映射底图。
Example: unity ovroverlay 3.
请注意视觉缓冲区中的点状部分,这些部分表示 OVROverlay 在哪里打了一个洞,以便在场景几何体后面显示立方体映射底图。
检查场景中的立方体贴图是否是透明的。如果是,则使用 OVRUnderlayTransparentOccluder,这对于任何 Alpha 值小于 1 的底图都是必需的。如果它是立体图像,则需指定两个纹理,并将大小设置为 2。

使用圆柱叠加图层

圆柱叠加图层游戏对象的中心用作圆柱中心。圆柱的尺寸编码于 transform.scale,具体如下:
  • [scale.z] 圆柱半径
  • [scale.y] 圆柱高度
  • [scale.x] 圆柱弧长
要使用圆柱叠加图层,相机必须置于圆柱的内接球体内。相机接近内接球体表面时,叠加图层会逐渐消失。由于只能显示一半的圆柱,因此弧度必须小于 180 度。

使用偏离中心立方图叠加图层

偏离中心立方图合成图层可通过抵消立方图采样坐标来提高所关注区域/可见区域的分辨率。其类似于标准立方图合成图层。
将 OVROverlay 脚本附加到空游戏对象,并在位置变换字段指定纹理坐标偏移量。有关详细信息,请参阅 Unity 脚本编写参考文档中的 OVROverlay。

全局锁定层与头部锁定图层

悬窗图层几乎总是应该全局锁定,这意味着它们相对于其后面的世界保持位置不变。
  • 与全局锁定的非悬窗内容类似,全局锁定的悬窗也使用 TimeWarp 技术,因此更不容易出现卡顿现象。
  • 头部锁定的悬窗会绕过 TimeWarp 技术,精确跟随头部的运动。唯一的例外是一些小的用户界面元素,比如注视光标或瞄准准星。
悬窗默认全局锁定。要创建一个头部锁定的悬窗层,需要将图层(通常是一个四边形)设置为 OVRCameraRig 中心眼锚点的子对象。

Common OVROverlay 用例

我们列出了一些使用合成器图层和不同 OVROverlay 功能的常见用例。

播放高质量视频

对于视频播放应用来说,使用合成器图层而不是渲染到 Unity 通常渲染的视觉缓冲区中,这一点极其重要。
使用 OVROverlay 显示高质量视频有两种方法:
  • 要在游戏中渲染或创建的悬窗图层上播放视频,您可以覆盖使用默认矩形功能。这允许您渲染单个纹理,从而节省了渲染两个纹理的成本,同时获得更高的分辨率。
  • 为了播放高质量的外部视频,您可以使用是外部表面功能,利用 Android 插件将外部视频直接馈送到合成器中。

加载屏幕

可以使用两个 OVROverlay 图层添加轻量级的加载屏幕。
  1. 添加一个立方体贴图层作为加载屏幕的背景。如果将其留空,它将显示一个黑色的空洞。
  2. 添加另一个悬窗图层,通常是一个简单的四边形,上面带有一些纹理或文字,以指示用户正处于加载间隔状态。
有关详细信息,请打开起始示例中的 OVROverlay 示例。

凝视光标或瞄准准星

要添加凝视光标或瞄准标线(或类似物),请将 OVROverlay 四边形添加到场景中,并将其作为 OVRCameraRig 中心眼锚点的子对象。

OVROverlay 示例

我们在 OVROverlay 示例文档中演示了 OVROverlay 功能。在起始示例文档中了解有关探索示例场景的更多信息。