为实现稳定的全息影像,HoloLens 内置了图像防抖动管道。 防抖动管道在后台自动运行,因此无需执行任何额外的步骤来启用它。 但是,应运用技术来增强全息影像稳定性,并避免采用降低稳定性的方案。

全息影像质量术语

良好的环境和卓越的应用开发造就了高质量的全息影像。 当 HoloLens 可以跟踪周围环境时,以每秒 60 帧的恒定速度运行在其中的应用可确保同步全息影像和匹配的坐标系。从用户的角度来看,本来静止的全息影像不会相对于环境移动。

以下术语可帮助确定环境问题、呈现速率不一致或较低或者任何其他问题。

  • 准确度。 将全息影像锁定在外部环境并放置在现实世界后,它的位置就应相对于周围环境保持不变,且不受用户运动或少量细微的环境变化的影响。 如果之后全息影像出现在非预期位置,那么就存在准确度问题。 如果两个不同的房间看起来相同,则可能会发生这种情况。
  • 抖动。 当环境跟踪性能下降时,全息影像可能发生高频率晃动,用户就会观察到抖动。 对于用户而言,解决方案是运行 传感器优化
  • 颤动。 呈现频率低会导致全息影像运动不均衡和重影。 颤动在动态全息影像中尤为明显。 开发人员需要保持 恒定的 60 FPS
  • 偏移。 用户发现全息映像发生偏移,远离了它的最初放置位置。 将全息影像放置在远离 空间定位点 的位置,尤其是环境中未映射的部分时,就会发生偏移。 将全息影像创建在接近空间定位点的位置可降低偏移的可能性。
  • 跳动。 全息影像偶尔在所在位置上“弹出”或“跳动”。 当跟踪调整全息影像以匹配对环境的更新理解时,可能会发生跳动。
  • 浮动。 全息影像随用户头部的运动而发生摇摆。 当应用程序未完全实现 重新投影 ,且没有为当前用户 校准 HoloLens 时,就会出现浮动。 用户可以重新运行 校准 应用程序来修复此问题。 开发人员可以更新防抖动平面,以进一步增强稳定性。
  • 分色。 HoloLens 采用色序显示法,以 60 赫兹的频率闪烁红-绿-蓝-绿色彩通道(单个色域以 240 赫兹的频率显示)。 用户双眼跟踪移动的全息影像时,全息影像首尾边缘的构成色彩总会分离,形成彩虹效果。 分色程度取决于全息影像的移动速度。 在某些罕见情况下,查看某个固定全息影像时迅速移动头部也会形成彩虹效果,这种现象称为 分色
  • 帧速率是全息影像稳定性的第一要素。 要使全息影像在外部环境中稳定显示,提供给用户的每个图像都必须在正确的位置中绘制全息影像。 HoloLens 每秒刷新 240 次显示,为每个新呈现的图像显示四个单独的色域,因而实现 60 FPS(每秒帧数)的用户体验。 为了尽可能提供最佳体验,应用程序开发人员必须保持 60 FPS,这意味着始终每隔 16 毫秒向操作系统提供一个新图像。

    60 FPS。若要绘制全息影像以使其看起来像是在现实世界中,HoloLens 需要从用户的立场呈现图像。 由于图像呈现需要时间,HoloLens 会预测显示器显示图像时用户头部的位置。 但是,此预测算法采取近似值。 HoloLens 的硬件会调整呈现的图像,以考虑到预测头部位置与实际头部位置之间的偏差。 此调整会使用户看到的图像如同从正确的位置呈现,同时使全息影像给人以稳定感。 图像更新在小幅更改时效果最好,无法完全修复呈现图像中的某些问题,如运动视差。

    采用 60 FPS 进行呈现时,可以通过以下三种方法来帮助实现稳定的全息影像:

  • 最大程度降低呈现图像和用户查看图像之间的总体延迟。 在以一致步调运行游戏和呈现线程的引擎中,以 30 FPS 运行可能会额外增加 33.3 毫秒的延迟。 降低延迟会减少预测误差,并提高全息影像的稳定性。
  • 这样,每个图像到达用户眼部的延迟时间就会一致。 如果采用 30 FPS 进行呈现,而显示器仍然以 60 FPS 显示图像,则意味着相同图像会连续显示两次。 第二帧的延迟时间将比第一帧多 16.6 毫秒,必须纠正更明显的错误量。 这种错误量的不一致会导致不必要的 60 赫兹颤动。
  • 减轻视觉上的抖动,其特征是运动不均衡和重影。 全息影像运动速度越快且渲染速率越低,抖动就越明显。 始终保持 60 FPS 将有助于避免给定移动全息影像发生颤动。
  • 帧速率一致性。帧速率一致性与每秒高帧数同等重要。 对于任何内容丰富的应用程序,帧数偶尔减少不可避免,HoloLens 可实现一些复杂的算法从偶然故障中恢复。 但是,持续以波动的帧速率运行比持续以较低帧速率运行更会引起用户的注意。 例如,在五帧内平滑呈现(在这五帧的持续时间内速度为 60 FPS),然后在接下来 10 帧内每隔一帧丢帧(在这 10 帧的持续时间内速度为 30 FPS)的应用程序,会显得比始终以 30 FPS 速度呈现的应用程序更不稳定。

    此外,当正在运行 混合现实捕获 时,操作系统会将应用程序的速度限制为 30 FPS。

    性能分析。可使用如下所述的不同工具来对应用程序帧速率进行基准测试:

  • GPUView
  • Visual Studio 图形调试器
  • 内置于 3D 引擎(例如 Unity)的探查器
  • 全息影像呈现距离

    人类视觉系统在固定和聚焦于某个对象时,会整合多种与距离有关的信号。

  • 调节 - 单眼聚焦。
  • 收敛 - 双眼向内或向外移动以集中到某个对象上。
  • 双眼视力 - 左眼图像与右眼图像之间的差异取决于对象到固定点的距离。
  • 阴影部分、相对角度大小和其他单眼线索。
  • 收敛和调节的独特之处在于,它们的视网膜外线索与眼球如何变化以感知不同距离的对象有关。 在自然观景中,收敛和调节是相互关联的。 当双眼观看近距离的对象(例如鼻子)时,视线将会交叉并调节到一个较近的点。 当双眼观看无限远的对象时,视线会变得平行,双眼会调节以适应无限远的距离。

    佩戴 HoloLens 的用户将始终适应 2.0 米的距离,从而保持观看清晰的图像,因为 HoloLens 显示器固定在大约距离用户 2.0 米的光学位置。 应用开发人员可以通过在不同的深度放置内容和全息影像,来控制用户进行双眼收敛。 当用户调节和收敛到不同的距离时,两个线索之间的自然关联中断,导致视觉不适感或疲劳,冲突很强烈时尤为如此。

    将双眼收敛后观看到的内容尽可能地保留在 2.0 米的位置(例如,在具有许多深度的场景中,将兴趣区域尽量放置在靠近 2.0 米的位置),可以避免或尽量减轻视觉辐辏-调节冲突造成的不适感。 如果无法将内容放置在靠近 2.0 米的位置,当用户的视线在不同的距离之间来回移动时,视觉辐辏-调节冲突造成的不适感最强烈。 换言之,观看 50 厘米远的静态全息影像,比观看 50 厘米远的前后不断移动的全息影像要舒适得多。

    将内容放置在 2.0 米处也是有利的,因为两台显示器设计为在此距离处完全重叠。 对于放置在此平面之外的图像,当它们移出全息帧的一侧时,它们将显示在一台显示器上,同时仍然可见于另一台显示器上。 这种双眼对抗可能会对全息影像的深度感知造成破坏。

    全息影像与用户之间的最佳距离

    剪裁平面。为获得最大舒适度,建议剪裁呈现距离为 85 厘米,并在 1 米处开始淡出内容。 在全息影像和用户均静止的应用程序中,可以在 50 厘米近的位置舒适地观看全息影像。在这些情况下,应用程序应将剪裁平面放置在不超过 30 厘米的位置,并且应在距剪裁平面至少 10 厘米的位置开始淡出。 当内容距离小于 85 厘米时,务必确保用户不会频繁地靠近或远离全息影像,或全息影像不会频繁地靠近或远离用户,因为这些情况极有可能引起视觉辐辏-调节冲突的不适感。 内容的设计应尽量减少距离用户 85 厘米以内的交互需求,但是当内容必须呈现在 85 厘米以内时,对于开发人员而言,一个很好的经验法则是设计用户和/或全息影像深度移动时间不超过 25% 的场景。

    最佳做法。当全息影像无法放置在 2 米的位置且无法避免视觉收敛和调节之间的冲突时,全息影像的最佳放置区域应在 1.25 米和 5 米之间。 在每种情况下,设计人员都应构建好内容场景,以鼓励用户在距离内容 1 米的位置来与内容交互(例如,调整内容大小和默认位置参数)。

    HoloLens 提供一种复杂的硬件辅助全息稳定技术,称为重新投影。 重新投影考虑了场景动画处理和用户头部移动时的动态效果和视点 (CameraPose) 的变化。 应用程序需要执行特定操作以充分利用重新投影。

    重新投影包含四种主要类型

  • 深度重新投影:应用程序能以最低的工作量实现最佳的结果。 呈现场景的各个部分都基于各自与用户之间的距离进行单独的稳定性处理。 当深度发生急剧变化时,可能会看到一些呈现伪影。 此选项仅适用于 HoloLens 2 和沉浸式头戴显示设备。
  • 平面重新投影:允许应用程序精确控制稳定性。 应用程序设置一个平面,该平面上的所有内容将是场景中最稳定的部分。 全息影像离平面越远,呈现就越不稳定。 此选项适用于所有 Windows MR 平台。
  • 自动平面重新投影:系统使用深度缓冲区中的信息设置防抖动平面。 此选项适用于 HoloLens 第 1 代和 HoloLens 2。
  • 无:如果应用程序不执行任何操作,则会使用平面重新投影并在用户头部凝视方向的 2 米处固定防抖动平面,通常结果不达标。
  • 应用程序需要执行特定操作以启用不同类型的重新投影

  • 深度重新投影:应用程序针对呈现的每一帧向系统提交深度缓冲区。 在 Unity 上,深度重新投影通过“Windows Mixed Reality 设置”窗格的“XR 插件管理”下的“共享深度缓冲区”选项来完成 。 DirectX 应用调用 CommitDirect3D11DepthBuffer, 它不应调用 SetFocusPoint。
  • 平面重新投影:应用程序会针对每一帧告知系统要稳定的平面位置。 Unity 应用程序调用 SetFocusPointForFrame,并应禁用“共享深度缓冲区” 。 DirectX 应用调用 SetFocusPoint,不应调用 CommitDirect3D11DepthBuffer。
  • 自动平面重新投影:若要启用,应用程序需要像深度重新投影那样将其深度缓冲区提交给系统。 使用混合现实工具包 (MRTK) 的应用可以将 摄像头设置提供程序 配置为使用“自动平面重新投影”。 本机应用应将每一帧的 HolographicCameraRenderingParameters 中的 DepthReprojectionMode 设置为 AutoPlanar 。 对于 HoloLens 第 1 代,应用程序不应调用 SetFocusPoint。
  • 选择重新投影技术

    防抖动类型 沉浸式头戴显示设备 HoloLens 第 1 代 HoloLens 2 默认建议使用 如果深度重新投影不能提供最佳结果,则建议使用此选项

    建议 Unity 应用程序使用 Unity 2018.4.12+、Unity 2019.3+ 或 Unity 2020.3+。 以前的 Unity 版本会导致重新投影效果略微下降。 平面重新投影 如果自动平面重新投影不能提供最佳结果,则建议使用此选项 如果两个深度选项都不能获得所需结果,请使用此选项

    验证是否正确设置深度

    当重新投影方法使用深度缓冲区时,务必验证深度缓冲区的内容是否表示应用程序的呈现场景。 许多因素可能导致问题。 例如,如果有第二个摄像头用于呈现用户界面覆盖层,则可能会覆盖实际视图的所有深度信息。 透明对象通常不设置深度。 某些文本呈现默认情况下不设置深度。 当深度与呈现的全息影像不匹配时,会出现明显的呈现问题。

    HoloLens 2 提供一个可视化工具,可用于显示设置和未设置深度的位置,该工具可从“设备门户”启用。 在“视图”>“全息影像稳定性”选项卡上,选中“在头戴显示设备中显示深度可视化”复选框 。 正确设置深度的区域将为蓝色。 未设置深度的呈现项将标记为红色,需要修复。

    混合现实捕获中不会显示深度可视化。 它仅在设备上可见。

    某些 GPU 查看工具允许可视化深度缓冲区。 应用程序开发人员可以使用这些工具来确保正确设置深度。 请参阅应用程序工具的文档。

    使用平面重新投影

    对于桌面沉浸式头戴显示设备,设置防抖动平面通常会起反作用,因为它提供的视觉质量低于通过向系统提供应用的深度缓冲区以启用的基于每像素深度的重新投影。 除非在 HoloLens 上运行,否则通常应避免设置防抖动平面。

    设备将自动尝试选择此平面,但应用程序应通过选择场景中的焦点来提供支持。 在 HoloLens 上运行的 Unity 应用应根据场景选择最佳焦点,并将其传递到 SetFocusPoint() 。 默认的旋转多维数据集模板中包含了在 DirectX 中设置焦点的示例。

    在连接到台式电脑的沉浸式头戴显示设备上运行应用时,Unity 会将深度缓冲区提交到 Windows,以便启用每像素重新投影,这样,应用无需显式运行就能提供更高的图像质量。 当应用在 HoloLens 上运行时,只应提供焦点,否则将覆盖每像素重新投影。

    // SetFocusPoint informs the system about a specific point in your scene to
    // prioritize for image stabilization. The focus point is set independently
    // for each holographic camera.
    // You should set the focus point near the content that the user is looking at.
    // In this example, we put the focus point at the center of the sample hologram,
    // since that is the only hologram available for the user to focus on.
    // You can also set the relative velocity and facing of that content; the sample
    // hologram is at a fixed point so we only need to indicate its position.
    renderingParameters.SetFocusPoint(
        currentCoordinateSystem,
        spinningCubeRenderer.Position
    

    焦点的位置很大程度上取决于全息影像所查看的内容。 应用提供凝视矢量参考,应用设计人员了解他们希望用户观看的内容。

    为稳定呈现全息影像,对于开发人员而言,最重要的是以 60 FPS 的速度进行呈现。 无论怎样优化防抖动平面,如果速度低于 60 FPS,全息影像的稳定性还是会大大降低。

    最佳做法。没有通用方法来设置防抖动平面,它是特定于应用的。 我们的主要建议是试验以了解哪种方法最适合你的方案。 但是,请将尽可能多的内容对齐防抖动平面,因为此平面上的所有内容都能完美实现稳定性。

  • 如果只有平面内容(阅读应用、视频播放应用),请将防抖动平面对齐包含内容的平面。
  • 如果有三个已锁定在外部环境的小球体,则使防抖动平面“贯穿”当前用户视野中的所有球体中心。
  • 如果场景内容处于明显不同的深度,则最好获取更多对象。
  • 确保调整每一帧的防抖动点,以与用户观看的全息影像相一致
  • 应避免的问题。防抖动平面是实现稳定全息影像的好工具,但如果误用它,可能会导致图像严重不稳定。

  • 使用完后,别忘了关闭它。 可以将防抖动平面置于用户身后或将其附加到不再处于用户视野中的对象,以此结束使用它。 确保将防抖动平面的法线设置为与摄像头前向相反(例如 -camera.forward)
  • 请勿快速在两端之间来回更改防抖动平面
  • 请勿将防抖动平面保留设置为固定距离/方向
  • 请勿让防抖动平面贯穿用户
  • 请勿在运行于台式电脑(而非 HoloLens)时设置焦点,应改为使用基于每像素深度的重新投影。
  • 由于 HoloLens 显示器的性质,有时可以感知到称为“分色”的伪影。 它表现为图像分离成单独的基准颜色 - 红色、绿色和蓝色。 当显示白色对象时,伪影尤其明显,因为这些对象具有大量红色、绿色和蓝色。 当用户对高速穿过全息帧的全息影像进行视觉跟踪时,这一点最为明显。 此外,伪影还可以表现为对象扭曲/变形。 如果对象具有高对比度和/或为纯色(例如红色、绿色、蓝色),则会将分色感知为对象不同部分的扭曲。

    当用户头部转到一侧时,处于头部锁定状态的白色圆形光标的分色可能的外观示例:

    尽管很难完全避免分色,但有几种技术可以减轻这种情况。

    以下对象会发生分色:

  • 快速移动的对象,包括处于头部锁定状态的对象,如光标
  • 距离防抖动平面非常远的对象。
  • 若要减轻分色影响,请执行以下操作:

  • 使对象滞后于用户的凝视。 它应该看起来像有惯性,并且好像通过“弹簧”连接到凝视。 此方法可降低光标速度(缩短分离距离)并将其置于用户可能的凝视点后面。 只要它可以在用户停止转移凝视时快速跟上,就会感觉很自然。
  • 如果确实想移动全息影像,且希望用户用双眼跟踪它,请尽量将其移动速度保持在 5 度/秒以内。
  • 请使用光线光标,而不是几何图形光标。 会将连接到凝视的虚拟照明源感知为交互式指针,但它不会导致分色。
  • 调整防抖动平面,以匹配用户正在凝视的全息影像。
  • 使对象变成红色、绿色或蓝色。
  • 切换到模糊的内容版本。 例如,可以将圆形白色光标更改为指向运动方向的略微模糊的线条。
  • 与之前一样,以 60 FPS 速度进行呈现和设置防抖动平面是实现全息影像稳定性最重要的技术。 如果遇到明显分色,请首先确保帧速率符合预期。

  • 了解混合现实的性能
  • 颜色、光线和材料
  • MRTK 全息影像稳定化
  •