现在,Unity正式将虚拟现实制作带到中。在2019.3中我们发布了HDRP 7.2.0版本,管线现已经过验证,可用于制作VR。
本博文将从技术角度说明如何在VR项目中应用HDRP。
HDRP中的VR有以下特点:
兼容所有HDRP功能特性。
新的Unity XR Plugin Framework完全支持HDRP。
默认也是推荐的,渲染方案为单通道实例化。
卓越特性
使用HDRP制作的VR项目可以完全地利用起管线的功能特性,制作直抵想象边界的体验。HDRP带有的尖端渲染技术,可以产出炫目、逼真的图像,在虚拟现实领域几乎无出其右。
下方列出的是可用于制作VR项目的功能特性:
延迟和前向渲染
所有类型的光照、阴影、贴花和体积效果
屏幕空间效果
环境光遮蔽(AO)
屏幕空间反射(SSR)
次表面散射(SSS)
变形和折射
后期处理效果
颜色分级、抗锯齿、景深等等。
Visual Effect Graph的所有VFX
平台支持
应用HDRP的VR目前支持以下平台和设备:
Oculus Rift & Rift S (Oculus XR Plugin, Windows 10, DirectX 11)
Windows Mixed Reality (Windows XR Plugin, Windows 10, DirectX 11)
PlayStationVR
OpenVR:Valve目前正在为2019.3及更高版本开发OpenVR的Unity XR Plugin,插件将在不久后发布。
立体式渲染技术
原生的VR渲染会分左右眼分别处理两次图像,我们称之为多通道渲染。HDRP虽然支持多通道渲染,但该方法会让应用的渲染占用两倍的CPU能耗,还会发起两倍的绘制调用。此外,阴影也会被渲染两遍,吃掉不少GPU性能,因此我们不推荐该方法。
尽管如此,部分情境下使用多通道是合适的:
系统的GPU内存较小,而多通道比单通道渲染占用的内存更少。
出于某种原因,希望在两只眼分别渲染不同的图像。
使用单通道(实例)渲染是一个更快的方案。在此模式下,每次绘制调用渲染的是两只眼的图像,渲染目标和实例绘制调用中使用的是一系列纹理组。此外,每帧系统会只处理一次剔除和阴影。
HDRP在设计时确保了所有功能特性能与VR兼容,在单通道渲染上效果能达最优。
管线一个关键的特性是在所有渲染目标上使用纹理组(包括VR和其它所有内容)。这样的特性,外加上着色器的泛用性,可以让我们制作自动兼容VR的着色器,除了一些特殊用例(比如光照生成列表、间接图块式延迟渲染、体积光和相机相对位置渲染)。
请注意,HDRP并不支持双倍宽度纹理(double-wide texture,即同时渲染左眼和右眼图像,将两张图作为一个纹理,区别于传统的VR图像渲染)的单通道渲染,因为全屏的渲染通道和效果处理起来更加复杂、能耗更高。
开始使用HDRP VR
若想开始使用HDRP VR,请查看Unity说明文件的VR Overview(VR概览)部分。为了帮助你设置启用针对VR的HDRP开发,我们还提供有HDRP Wizard向导,来验证、改正设置。
HDRP VR Wizard向导程序
若想手动修改新XR插件框架中的VR配置,请参考该说明文件。若想设置起单通道渲染,必须同时将Project Settings(项目设置)选为Single-Pass Stereo Rendering模式,将HDRP资源设置也设定为Single Pass。如果这两个选项未设定未单通道,HDRP会默认使用多通道。
在Project Settings(项目设置)和HDRP资源设置中启用Oculus插件的Single Pass(单通道)渲染。
抗锯齿
为了创造良好的用户体验,避免打破虚拟环境的沉浸感,减少图像的锯齿非常重要。HDRP提供有几种抗锯齿方案。
摄像机的抗锯齿模式在Unity说明文件中有详细的介绍。选项包括:
多重采样抗锯齿。支持前向渲染,可以更改采样数(2x,4x,8x),平衡质量和性能。该技术效果较好,性能耗费也较大。
时序性抗锯齿,大部分应用的最佳方案。该技术能有效减少锯齿,但也会使部分细节模糊。可以通过调整锐化过滤,减少模糊度。
快速近似抗锯齿(FXAA)与亚像素形态抗锯齿(SMAA)是功耗较低的两个方案。
MSAA可以与TAA、FXAA或SMAA组合使用,画质会提高,而能耗也会累加。
Geometric Specular Anti-Aliasing(几何镜面抗锯齿)可以为材质添加抗锯齿着色效果,效果可在材质上直接调整。建议在平滑、密实的表面使用。
性能
由于双眼显示都需要较高的刷新率和分辨率,VR渲染能耗非常高,所以请在HDRP资源设置中禁用不需要的功能。Volumetric(体积)功能虽然支持VR,但并不能达到90fps的标准,所以不适合用于VR应用。而时常监控、分析性能可以帮助你找出项目的瓶颈。
请注意在VR中,体积效果(z轴平面)默认的精度将被减为一半,让GPU性能更能让人接受。除了volumetric lighting(体积光),我们还建议在VR项目中禁用HDRP Area Light(面积光)。面积光必须在shader configuration files(着色器配置文件)中禁用。
在HDRP中,有两种渲染方法可以影响性能:前向和延迟受光着色器模式。若想了解两种模式间的不同,请查看该说明文件。渲染模式通常根据项目的需求决定。前向渲染可以启用MSAA,减少内存使用,而延迟渲染在光源数量较多时更加高效,内存使用也更多。
另一个影响GPU性能的因素是渲染缓存的分辨率。分辨率由XR显示插件设定,会根据头显的不同而调整。分辨率之后可在应用中调整,也可以使用dynamic resolution(动态分辨率)功能根据当前场景的内容来调整。比如,根据当前GPU的帧生成时间来调整分辨率。
为了支持HDRP的VR,我们使用一套着色器宏命令,帮助处理渲染目标视图的实例化和纹理阵列的使用。比如,你可以用下列代码为着色器声明纹理:
在支持纹理阵列的平台上,宏也会拓展为TEXTURE2D_ARRAY。如果平台不支持纹理阵列,或者ShaderConfig.cs中禁用了阵列,则宏会变成常规的TEXTURE2D。纹理采样中也有类似的功能。
在着色器上,正确的视图常量(图像矩阵、投影矩阵等等)会储存在阵列中,根据图元instanceID导出的眼球索引值来排列。在运算着色器时,z调度维度常用于识别双眼,而UNITY_XR_ASSIGN_VIEW_INDEX宏则用于指定正确的眼球索引。
HDRP VR的未来
HDRP的未来VR版本将着重于:
添加新的硬件选项,如Variable Rate Shading(速率可变着色),改善性能
用Vulkan和DX12改善平台支持
改善设备支持
拓展单通道方法,支持两个以上的视图
https://connect.unity.com/g/unity-hdrp
热门跟贴