使用高清晰度渲染管线创建沉浸式、逼真的VR体验

我们正式将虚拟现实带入高定义渲染管线(HDRP)。在2019.3.6f1及之后的版本中,HDRP现在已通过验证,并可以在VR中使用,包版本为7.3.1。
这篇博客文章深入探讨了在您的VR项目中使用HDRP的技术细节。要了解HDRP提供的所有可能性,请查看这篇博客文章。
HDRP中的VR设计为:
所有HDRP功能与VR兼容。
HDRP完全支持新的Unity XR插件框架。
单通道(实例化)是VR的默认和推荐渲染解决方案。
使用HDRP进行VR项目,您可以利用所有渲染管线的功能,创造出仅受您想象力限制的体验。凭借其最先进的渲染技术,HDRP可以提供惊人的、逼真的视觉效果,在虚拟现实环境中达到前所未见的质量。
以下是您VR项目可用功能的快速概述:
- 延迟和前向渲染
- 所有光源类型、阴影、贴花和体积效果
- 屏幕空间效果
- 环境光遮蔽(AO)
- 屏幕空间反射(SSR)
- 次表面散射(SSS)
- 失真和折射
- 后处理
- 色彩分级、抗锯齿、景深等。
- 来自视觉效果图的所有VFX
HDRP的VR目前可用于以下平台和设备:
- Oculus Rift和Rift S(Oculus XR插件,Windows 10,DirectX 11)
- Windows混合现实(Windows XR插件,Windows 10,DirectX 11)
- PlayStationVR
OpenVR:Valve目前正在为2019.3及更高版本开发他们的OpenVR Unity XR插件,该插件将很快可用。
立体渲染技术
本地VR实现将处理所有内容两次——每只眼睛一次。我们称这个解决方案为多通道渲染。HDRP支持多通道渲染,但我们不推荐这种方法,因为您的应用程序在渲染时将使用两倍的CPU功率,基本上使您的绘制调用数量翻倍。此外,阴影将被渲染两次,可能会消耗您GPU预算的相当一部分。
也就是说,在某些情况下,使用多通道是合适的:
- 如果您的系统具有较少的GPU内存,多通道在渲染目标上使用的内存比单通道少。
- 如果出于某种原因您需要为每只眼睛渲染截然不同的视点。
更快的解决方案是使用单通道(实例化)渲染。在这种模式下,每个绘制调用同时为两只眼睛渲染。这通过使用纹理数组作为渲染目标和实例化绘制调用来实现。此外,剔除和阴影每帧仅处理一次。
HDRP的设计使所有功能与VR兼容,并针对单通道渲染进行了优化。
关键设计决策是为所有渲染目标使用纹理数组(即使您不是为VR创建)。这个决定,加上着色器宏,使我们能够编写与VR自动兼容的着色器,除了少数特殊情况(例如,光源列表生成、间接瓦片延迟着色、体积光照和相机相对渲染)。
请注意,HDRP不支持双宽纹理的单通道渲染,因为所有全屏通道和效果所需的额外复杂性和开销。

要手动使用新的XR插件框架为您的项目配置VR,请参考文档。要设置单通道渲染,您必须将两个项目设置设置为单通道立体渲染模式和HDRP资产设置设置为单通道。如果这两个选项中的任何一个未启用单通道,HDRP将默认使用多通道。

抗锯齿
在VR中减少锯齿非常重要,以创造良好的用户体验并避免破坏虚拟环境的沉浸感。HDRP提供了几种解决方案来帮助抗锯齿。
相机抗锯齿模式在Unity的文档中详细描述。这些选项包括:
- 多重采样抗锯齿(MSAA)在前向渲染中受支持。您可以通过选择样本数量(2x、4x、8x)来平衡质量与性能。这种技术可以取得很好的效果,但也可能很昂贵。
- 时间抗锯齿可能是大多数应用程序的最佳解决方案。它在减少锯齿方面非常有效,但可能会模糊一些细节。您可以通过附带的锐化滤镜控制来抵消这种模糊。
- 一些相对便宜的解决方案包括快速近似抗锯齿(FXAA)或子像素形态抗锯齿(SMAA)。
- 也可以将MSAA与TAA、FXAA或SMAA结合使用。这种技术提高了视觉质量,但成本是累积的。
- 每种材料还可以使用几何高光抗锯齿进行额外的阴影抗锯齿,您可以直接在材料上进行调整。建议在光滑和密集的表面上使用。
性能
由于需要更高的刷新率和分辨率以同时显示给双眼,VR渲染极具挑战性。确保在HDRP资产设置中禁用您不需要的任何功能。像体积光这样的功能不适合VR应用,因为尽管支持,但其性能未达到所需的90 fps。频繁监控和分析性能将帮助您识别项目中的任何瓶颈。
请注意,默认情况下,VR中体积效果的精度(z切片)将减半,以保持GPU性能更可接受。除了体积光照,在进行VR项目时,强烈建议禁用HDRP区域光支持。与其他功能不同,区域光必须通过着色器配置文件禁用。
HDRP中有两种渲染方法,这也会影响性能:光照着色器模式前向和延迟。要了解这两种模式之间的差异,请参阅文档。为VR选择正确的模式取决于项目的要求。前向渲染允许您启用MSAA并减少内存使用,而延迟渲染对于具有大量光源的项目更高效,但也消耗更多内存。
影响GPU性能的另一个因素是渲染缓冲区的分辨率。此分辨率最初由XR显示插件设置,并取决于您使用的耳机。然后,您可以在应用程序中调整分辨率,或使用动态分辨率功能根据当前场景的上下文来驱动分辨率。例如,分辨率可以根据当前GPU帧时间进行调整。
有关更多提示,请查看2019年哥本哈根Unite的HDRP VR演讲。
为了在HDRP中支持VR,我们添加了一组着色器宏,以帮助处理视图实例化和渲染目标的纹理数组使用。例如,您可以在着色器中使用以下代码声明一个纹理:
TEXTURE2D_X(MyTexture);
在支持纹理数组的平台上,此宏将扩展为TEXTURE2D_ARRAY。如果平台不支持纹理数组,或者在ShaderConfig.cs中的设置被禁用,则宏将扩展为常规的TEXTURE2D。纹理采样的类似功能也可用。
在着色器方面,适当的视图常量(视图矩阵、投影矩阵等)存储在数组中,并根据眼睛索引进行索引,该索引源自原始体的instanceID。在计算着色器的情况下,z调度维度用于识别每只眼睛。宏UNITY_XR_ASSIGN_VIEW_INDEX通常用于分配适当的眼睛索引。
HDRP VR的未来版本将专注于:
- 通过新的硬件选项(如可变速率着色)提高性能
- 通过Vulkan和DX12改善平台支持
- 改善设备支持
- 扩展单通道以支持超过两个视图
您今天可以开始利用HDRP VR。我们希望在HDRP论坛中听到您的反馈,因为我们将继续进行改进。
