虚拟现实最佳实践

本页面的内容:

为使用户获得最佳 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 执行的操作进行分析。

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 体验。

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

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_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 空间中实时创建了更多顶点并进行了置换,从而实际构成了缺失的细节。