虚拟现实最佳实践

为使用户获得最佳 VR 体验,虚拟现实(VR)开发要求对工作流程进行一些调整。此指南中将讲述 VR 项目开发时需要注意的数个要点。

VR 项目设置

新建 VR 项目时(无论项目基于蓝图还是基于 C++),推荐将其设为使用 Mobile / TabletScalable 3D or 2DNo Starter Content 选项,以保证项目从开始便在框架上运行。

VR_Project_Settings.png

VR .INI 设置

以下 .INI 设置取自 UE4 支持的 VR demo Showdown。如这些 .INIsettings 被使用,应被添加至 SystemSettings 下的项目 Config\ DefaultEngine.INI 文件。

[SystemSettings]
r.VolumeMultiplier=1.0
r.screenpercentage=130
r.SeparateTranslucency=0
r.HZBOcclusion=0
r.FinishCurrentFrame=1
r.MotionBlurQuality=0
r.PostProcessAAQuality=3
r.BloomQuality=1
r.EyeAdaptationQuality=0
r.AmbientOcclusionLevels=0
r.SSR.Quality=1
r.DepthOfFieldQuality=0
r.SceneColorFormat=2
r.SSSSS=0
r.TranslucencyVolumeBlur=0
r.TranslucencyLightingVolumeDim=4
r.MaxAnisotropy=8
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.FastBlurThreshold=0
showflag.decals=0
r.SSR.MaxRoughness=0.1
r.rhicmdbypass=0
r.TiledReflectionEnvironmentMinimumCount=10
sg.EffectsQuality=2
sg.PostProcessQuality=0

VR 实例化立体

UE4 4.11 版本中加入了实例化立体渲染(Instanced Stereo Rendering),以减轻 UE4 中的 VR 性能影响。在 Edit -> Project Settings -> Rendering -> VR 路径下勾选 Instanced Stereo 选项即可启用此功能。

VR_ISR.png

启用实例化立体渲染后,需要重启引擎并重新编译着色器。功能启用后,可在静态网格体、骨骼网格体、sprite 粒子和网格体粒子上使用基础通道和早期 Z 通道(串行和并行渲染两者均可)。实例化立体当前可在 PC(DirectX)和 PS4 上使用,其他平台的支持将在 4.11 后的版本中陆续呈现。以下视频为您展示 VR 标准立体渲染和实例化渲染的对比。

VR 性能分析

如需找到 VR 项目中开销过高的资源,须在项目生命周期中尽多地对项目在 CPU 和 GPU 执行的操作进行分析。

  • GPU 分析 - 运行项目时按下 CTRL + SHIFT + ,(逗号键) 即可启用 GPU 分析工具。按下组合键后,将出现与下图相似的新窗口。 VR_GPU_Profiler.png

  • CPU 分析工具 - 项目的 CPU 分析比 GPU 分析更为复杂。请查阅 性能分析工具 文档中的详细操作说明。

VR 后期处理设置

由于 VR 的渲染要求较高,因此需要禁用诸多默认开启的高级后期处理功能,否则项目可能出现严重的性能问题。执行以下步骤完成项目设置。

  1. 在关卡中添加一个后期处理(PP)体积域。

  2. 选择 PP 体积域,然后在 Post Process Volume 部分启用 Unbound 选项,使 PP 体积域中的设置应用到整个关卡。

    VR_PP_Unbound.png

  3. 打开 后期处理体积域Settings,前往每个部分将启用的 PP 设置禁用 - 先点击属性启用,然后将默认值(通常为 1.0)改为 0 即可将功能禁用。

    VR_Disable_PP_Settings.png

    执行此操作时,无需点击每个部分并将所有属性设为 0。可先行禁用开销较大的功能,如镜头光晕(Lens Flares)、屏幕空间反射(Screen Space Reflections,SSR)、Temporal AA(TAA)、屏幕空间环境遮挡(SSAO)、光晕(Bloom)和其他可能对性能产生影响的功能。

VR 世界场景比例

正确的世界场景比例是在 VR 平台上获得最佳用户体验的重要因素之一。不正确的比例可能导致用户出现各种感官问题,甚至引起“模拟疾病”。物体和玩家摄像机之间的距离在 0.75 到 3.5 米 之间时,在 VR 中的显示效果最佳。在 UE4 中,1 个虚幻单位(UU)长度为 1 厘米(CM)。这意味着虚幻引擎中的物体和玩家摄像机之间的距离在 75 UU 到 350 UU 时 VR 显示效果最佳。

距离

虚幻单位距离(UU)

1 厘米

1 虚幻单位

1 米

100 虚幻单位

1 千米

100,000 虚幻单位

可通过 World Settings 下的 World to Meters 变量对世界场景比例进行调整。 增加或减少此数值可使用户感受到周围世界场景的大小变化。假定内容以 1 个虚幻单位(1 CM)构建,将 World To Meters 设为 10 会使世界场景显示较大,如 World To Meters 设为 1000,世界场景则显示较小。

T_VR_World_To_Meters_00.png

VR 和模拟疾病

“模拟疾病”是一种晕动病,用户使用 HMD 设备体验虚拟世界时可能出现此症状。模拟疾病对 VR 用户体验有极大影响,在某些情况下甚至可能导致 VR 体验无法继续。为降低出现糟糕 VR 体验的可能性,敬请 严格 按照下列最佳方法进行操作。如若不然,可能出现十分糟糕的 VR 体验。

  • 帧率必须得到保证。理想状态是拥有一定缓冲,确保帧率高于 HMD 的本体帧率。较低的帧率可能引起模拟疾病,因此必须对项目进行高效率的优化。下表包含诸多 UE4 支持的 HMD,以及在这些设备上运行 VR 项目的目标帧率。

    HMD 设备

    目标帧率

    DK1

    60 FPS

    DK2

    75 FPS

    Rift 零售版

    90 FPS

    Vive

    90 FPS

    Gear VR

    60 FPS

    PSVR

    最高可达 120 FPS

  • 开发人员 非常不适合 作为测试对象,因为他们已经完全适应了 VR 设备的体验。尽量让更多用户体验项目,看他们是否会出现模拟疾病。

  • 不要 使用动态视角或其他脱离玩家动作自动进行摄像机运动的操作,因为这是糟糕 VR 体验的最大罪魁祸首。

  • 不要 进行手动景深(FOV)覆写,不要 将此对用户公开进行编辑。数值须和头戴设备的物理几何体匹配,镜头应通过设备的 SDK 和内部配置自动设置。如存在不匹配,用户转头时虚拟世界将出现变形,导致用户出现不适或恶心的生理反应。

  • 不要 设置多数第一人称游戏中存在的“行走摆动”摄像机效果。摄像机上下移动模拟人体运动会导致用户出现模拟疾病,带来糟糕的 VR 体验。

  • 不要 在向用户表达事件时“摇晃”摄像机。如一颗手雷在玩家附近爆炸,非 VR 游戏允许出现摄像机摇晃;但在 VR 游戏中,摇晃摄像机容易引起模拟疾病。

  • 为 VR 游戏设计世界场景和关卡时,使用的灯光和颜色须比正常状态下更昏暗。VR 游戏中强烈而明亮的灯光容易引起模拟疾病。须使用偏冷的色调和偏昏暗的光线。

  • 用电梯替换楼梯。玩家快速移动时(尤其在如楼梯的结构上进行上下移动时)会使用户出现眩晕。

  • 玩家开始移动时即为最快速度,不要进行渐进加速;移动速度须保持恒定不变。

  • 不要 使用景深或动态模糊后期处理,因其会对用户看到的内容产生重要影响,还容易引起模拟疾病。

上表只是引起模拟疾病的部分主要原因,其他更多原因不在此一一列举。

VR 摄像机设置

在 UE4 中设置 VR 摄像机的方法取决于 VR 体验为坐立状态或站立状态。 在坐立体验中,需要将摄像机原点升高到角色站立时的高度。然而在站立体验中,必须将摄像机原点设为 0,处于地面之上。 可将摄像机组件以角色为基础(地平面)附着在场景组件上,或将眼睛高度(Eye Height)设为角色碰撞胶囊体圆柱体高度的一半。

VR 角色设置

使用 VR 头戴设备的角色设置与标准角色设置有所不同。需要对 VR 角色的高度、宽度、速度和摄像机位置进行微调。

在 VR 世界中构建物体时,数字物体的比例与真实物体的比例需保持一致。大小不一致可能无法达到预期的显示效果。

角色高度和宽度

角色高度和宽度须尽量与真实尺寸相同。尺寸过大或过小均可能无法达到预期的显示效果。

属性

UE4 默认

推荐 VR

高度:

192 CM

176 CM

宽度:

84 CM

68 CM

移动速度

VR 移动速度不存在推荐默认设置,因其主要由所需要的体验效果决定。以主要 VR demo 为例,其移动速度约为正常速度的 1/4。

属性

UE4 默认

推荐 VR

移动速度:

60 M/S

24 M/S

相机位置

VR 摄像机的位置应比基本眼睛高度稍低,以便对角色眼睛高度进行补偿。

属性

UE4 默认

推荐 VR

基本眼睛高度

180 CM

160 CM

VR 内容注意事项

构建 VR 内容时,须牢记用户可从多个角度进行观看。在普通项目中可执行以下操作,但在 VR 项目中不能执行:

  • 比例 - 须尽量使 VR 世界中的物体比例与现实世界一致。大小不匹配会引起眩晕或模拟疾病。

  • 多边形减面 - 在普通游戏中,可以将玩家看不见的物体多边形面移除。然而在 VR 游戏中,玩家观察的自由度更高,执行减面操作可能导致玩家看到不应该看到的物体,因此不能进行此操作。

  • 使用的灯光类型 - 构建 VR 项目时应使用 静态光照光照图,因为它们的渲染开销最低。如需使用动态光照,应尽量减少动态灯光的数量,使它们之间不存在交互。如场景为室外,须将定向光照设为动态而非静态,然后开启级联阴影贴图(CSM)并尽量进行简单设置,即可生成阴影。

  • VR & VFX - 在 VR 项目中,部分特效技法(如使用 SubUV 纹理 模拟火焰或烟雾)效果不佳。在多数情况下,需要使用静态网格体替代 2D 粒子模拟 VFX(如爆炸或烟雾拖尾)。近场特效或离摄像机非常近的特效在 VR 项目中效果上佳,但特效须由静态网格体粒子组成。

  • VR 和透明度 - 在 3D 图形渲染中,透明度的开销非常之大,因为每帧都需对其进行整体再次求值,以确保未发生变化。正因为再次求值的存在,VR 项目中透明度的渲染开销极大,大于其带来的效果增益。然而,使用 DitherTemporalAA 材质函数可解决解决这一难点。此材质函数将使材质拥有外观上的透明度,并避免常见透明度问题(如自我排序)。

    VR_Dither_Trans_AA.png

  • 尽量制造虚拟效果 - 在 VR 项目中达到性能目标需要通过巧妙方式实现开销较大的渲染效果(如动态阴影或光照)。Showdown 中已验证角色投射动态阴影每帧开销极大,因此其已被弃用。然而,这样将导致角色在移动时看上去如同漂浮在空中。使用虚拟团状阴影可将此问题解决。它可基于角色和世界场景中物体的距离动态调整阴影位置和强度。这样即可在玩家接近地面或其他物体时形成阴影投射的虚拟效果。

VR 蓝图函数

蓝图编辑器中有大量可与 VR 头戴设备和运动控制器交互的蓝图节点。 以下是这些节点的描述和功能说明。

头戴显示器蓝图节点

VR_HMD_BP_Nodes.png

蓝图节点名

功能

Enable HMD

切换至(或切换离)使用 HMD 立体渲染

Enable Low Persistence Mode

在高低持久性模式之间切换。

Get Orientation And Position

抓取 HMD 的当前朝向和位置。

Get Positional Tracking Camera Parameters

如 HMD 拥有一个追踪位置的摄像机,则将返回摄像机在游戏世界中的位置和追踪边界域的参数。此节点可在游戏中展示合法的位置追踪范围。如摄像机不可用或 HMD 不支持,所有数值将被归零。

Get Screen Percentage

返回 VR 模式中使用的屏幕百分比。

Get World to Meters Scale

返回 World to Meters 的尺寸,与玩家感受到的世界场景尺寸相对应。

Has Valid Tracking Position

确定 HMD 是否支持位置追踪,而无论玩家是否当前被追踪。

Is Head Mounted Display Enabled

返回玩家当前是否正在使用头戴设备。

Is In Low Persistence Mode

如 HMD 在低持久性模式中,返回 true,否则返回 false

Reset Orientation And Position

将绕 Z 轴的旋转和绕 X 轴的旋转设为 0,以重置朝向;假定当前绕 Y 轴的旋转方向超前,并假定当前位置为“零点”(便于位置追踪)。

Set Clipping Planes

设置立体渲染的近点和远点裁剪平面(NCP 和 FCP)。这和 'stereo ncp = fcp' 控制台命令相似,但通过此命令设置的 NCP 和 FCP 将不会被存入 .INI 文件。

Set World to Meters Scale

设置 World to Meters 尺寸,变更玩家感受到的世界场景尺寸。

Steam VR 蓝图节点

VR_Steam_VR_BP.png

蓝图节点名

功能

Get Hand Position and Orientation

给出一个控制器索引和一只手,返回控制器的位置和朝向。

Get Tracked Device Position and Orientation

抓取 HMD 当前朝向和位置。

Get Tracking Space

获取追踪空间(如坐立或站立),以确定原点位置。

Get Valid Tracked Device Ids

返回当前追踪的设备 ID 阵列。

Set Tracking Space

设置追踪空间(如坐立或站立),以变更返回的空间追踪位置。

VR 已知问题

由于 HMD 对部分美术技法的处理方式有所不同,因此部分传统视频游戏开发中基础内容的作用也将出现不同。 下表中为 VR 项目中可能无法正常使用的功能,以及可能的解决方法。

已知问题

解决方法

屏幕空间反射(SSR)

虽然 SSR 在 VR 项目中可正常使用,但对其产生的反射和世界场景中的反射物进行匹配时可能存在问题。可用 反射探头 替代 SSR,因其开销较低,受反射对其问题的影响也不大。

法线贴图问题

查看 VR 项目中物体上的法线贴图时,您可能会发现其部分功能已缺失。这是因为法线贴图无法用于双眼显示或运动视差。因此,通过 VR 设备查看时法线贴图看起来较平。但这并不代表着不应该或不需要使用法线贴图,这意味着需要进行精确评估,以确定通过几何体来构建法线贴图传递的数据是否更为可取。以下技法可用于替代法线贴图。

着色器类型

描述

视差贴图

视差贴图拥有法线贴图所不支持的深度提示,效果更佳。视差贴图着色器可更好地显示深度信息,使物体在视觉上拥有更多细节。原因是无论从和角度进行观察,视差贴图均会进行自我修正,显示视点的正确深度信息。视差贴图的最佳使用对象为鹅卵石小径或拥有高度细节的表面。

曲面细分着色器置换

曲面细分着色器置换可添加物体模型上不存在的细节,进行实时 3D 几何体置换。曲面细分着色器在信息展示上作用巨大,因其在 3D 空间中实时创建了更多顶点并进行了置换,从而实际构成了缺失的细节。