全息渲染概述

全息渲染让你的应用程序能够在用户周围世界的精确位置绘制全息影像,无论是精确放置在物理世界中还是在你创建的虚拟领域中。 全息影像是指能够发出声音和光线的对象。 渲染使你的应用程序能够添加光照。

设备支持

功能 HoloLens(第一代) HoloLens 2 沉浸式头戴显示设备
渲染

全息呈现

全息渲染的关键是了解所使用的设备类型。 具有透明显示屏的设备(例如 HoloLens)为真实世界增加了光线。 黑色像素是完全透明的,而较亮的像素则越来越不透明。 因为来自显示屏的光线与真实世界的光线融合,所以白色像素是半透明的。

虽然立体渲染会让你的全息影像产生深度暗示,但添加接地效果可以帮助用户更轻松地查看全息影像附近的表面。 一种基础技术是在附近表面的全息影像周围添加光晕,然后在该光晕下渲染阴影。 通过这种方式,你的阴影看上去是从环境中减少了光线。 空间音效是另一个重要的深度暗示,能够让用户推断全息影像的距离和相对位置。

具有不透明显示屏的设备,例如 Windows Mixed Reality 沉浸式头戴显示设备,会将真实世界挡在外面。 黑色像素是纯黑色,任何其他颜色对用户都显示为该颜色。 应用程序负责渲染用户看到的所有内容。 这样一来,保持恒定的刷新率就变得更加重要,可以使用户获得舒适的体验。

预测渲染参数

混合现实头戴显示设备(HoloLens 和沉浸式头戴显示设备)会持续跟踪用户头部相对于周围环境的位置和方向。 当你的应用程序开始准备其下一帧时,系统会预测在该帧出现在显示屏上的确切时刻用户头部的位置。 系统基于此预测来计算视图和投影变换以用于该帧。 你的应用程序必须使用这些转换来产生正确的结果。 如果不使用系统提供的变换,生成的图像将与现实世界不一致,导致用户不适。

注意

为了准确预测新的帧何时到达显示屏,系统会不断衡量应用程序渲染管道的有效端到端延迟。 当系统根据渲染管道的长度进行调整时,你可以通过尽可能缩短管道长度来提高全息影像的稳定性。

使用高级技术来增强系统预测的应用程序可以覆盖系统视图和投影变换。 这些应用程序仍必须使用系统提供的变换作为其自定义转换的基础,以产生有意义的结果。

其他渲染参数

渲染一帧时,系统会指定应用程序应在哪个后端缓冲区视区进行绘制。 此视区通常小于帧缓冲区的完整大小。 无论视区大小如何,应用程序在渲染一帧后,系统都将放大图像以填充整个显示屏。

对于发现自身无法以要求的刷新率进行渲染的应用程序,可以配置系统渲染参数,以增加像素混叠为代价来降低内存压力和渲染成本。 还可以更改后台缓冲区格式,对于某些应用,这有助于提高内存带宽和像素吞吐量。

要求你的应用渲染的渲染视锥、分辨率和帧速率也可能因帧而异,并且在左眼和右眼之间可能不同。 例如,当混合现实捕获 (MRC) 处于活动状态且未选择照片/视频相机视图配置时,可能会以更大的 FOV 或分辨率为单眼渲染。

对于任何给定的帧,你的应用必须使用系统提供的视图变换、投影变换和视区分辨率进行渲染。 此外,你的应用程序绝不能假设任何渲染或视图参数在帧与帧之间保持固定。 像 Unity 这样的引擎会在它们自己的摄像机对象中为你处理所有这些变换,以便始终采用用户的物理运动和系统状态。 如果你的应用程序允许用户在整个世界中进行虚拟移动(例如使用游戏手柄上的控制杆),则可以在摄像机上方添加一个父装配对象来移动。 这会导致摄像机同时反映用户的虚拟和物理运动。 如果你的应用程序修改了系统提供的视图变换、投影变换或视区尺寸,它必须通过调用适当的覆盖 API 来通知系统。

为了增强全息渲染的稳定性,你的应用应向 Windows 提供每帧用于渲染的深度缓冲区。 如果你的应用确实提供了深度缓冲区,它应该具有连贯的深度值,深度以距离相机的米数表示。 如果用户的头部最终与预测位置稍有偏差,这将使系统能够使用你的每像素深度数据来更好地稳定内容。 如果你无法提供深度缓冲区,可以提供一个焦点和法线,定义一个穿过大部分内容的平面。 如果同时提供了深度缓冲区和焦点平面,系统可能会同时使用这两者。 特别是,当你的应用程序显示运动的全息影像时,提供深度缓冲区和包含速度矢量的焦点会很有帮助。

有关此主题的初级详细信息,请参阅 DirectX 中的渲染一文。

全息摄像机

Windows Mixed Reality 引入了全息摄像机的概念。 全息摄像机类似于 3D 图形文本中的传统摄像机;全息摄像机同时定义了摄像机的外在(位置和方向)和内在属性。 (例如,视野用于查看虚拟 3D 场景。)与传统的 3D 摄像机不同,该应用程序无法控制摄像机的位置、方向和内在属性。 相反,全息摄像机的位置和方向是由用户的运动来隐式控制的。 用户的运动通过视图变换逐帧中继到应用程序。 同样,摄像机的内在属性由设备的校准光学器件定义,并通过投影变换逐帧中继。

通常,应用程序将针对单个立体摄像机进行渲染。 强大的渲染循环将支持多个摄像机,并将支持单目和立体摄像机。 例如,当用户激活混合现实捕获 (MRC) 等功能时,系统可能会要求你的应用程序从另一个角度进行渲染,具体取决于头戴显示设备形状。 可以支持多个摄像机的应用程序通过选择使用它们可以支持的摄像机类型来获取摄像机。

立体渲染

在以 3D 形式渲染医学 MRI 或工程体时,通常会使用体渲染技术。 这些技术在混合现实中很有趣,在混合现实中,用户只需移动头部就可以自然地从关键角度查看这样的体。

HoloLens(第一代)支持的分辨率

  • 最大视区大小是 HolographicDisplay 的一个属性。 HoloLens 默认设置为最大视区大小,即 720p (1268x720)。
  • 可以通过在 HolographicCamera 上设置 ViewportScaleFactor 来更改视区大小。 该比例因子在 0 到 1 的范围内。
  • HoloLens(第一代)支持的最低视区大小是 720p 的 50%,即 360p (634x360)。 这是 0.5 的 ViewportScaleFactor。
  • 不推荐任何低于 540p 的影像,因为这会造成视觉质量降低,但可以将其用来识别像素填充率的瓶颈。

HoloLens 2 支持的分辨率

  • 当前和最大支持的渲染目标大小是视图配置的属性。 HoloLens 2 默认设置为最大渲染目标大小,即 1440x936。
  • 应用可以更改渲染目标缓冲区的大小,具体做法是调用 RequestRenderTargetSize 方法来请求新的渲染目标大小。 将选择一个新的渲染目标大小,该大小满足或超过请求的渲染目标大小。 此 API 更改渲染目标缓冲区的大小,这需要在 GPU 上重新分配内存。 其意义在于:可以缩小渲染目标大小以减少 GPU 的内存压力,并且不能过于频繁地调用此方法。
  • 应用仍然可以像更改 HoloLens 1 那样更改视区大小。 GPU 上没有添加内存重新分配,因此可以频繁更改,但不能用于减轻 GPU 的内存压力。
  • HoloLens 2 上支持的最低视区大小为 634x412,使用默认渲染目标大小时,ViewportScaleFactor 约为 0.44。
  • 如果提供的渲染目标尺寸小于支持的最低视区尺寸,则视区比例因子将被忽略。
  • 不推荐任何低于 540p 的影像,因为这会造成视觉质量降低,但可以将其用来识别像素填充率的瓶颈。

另请参阅