[UE4讨论] 使用UE4开发VR内容

发表于2016-06-25
评论0 5k浏览
  此文作者是Epic Games的技术支持工程师Tom Looman,主要介绍了UE4对开发VR内容的支持及使用技巧。
  最近VR呼声越来越高,也有越来越多的开发者投入到VR领域。本文可作为想要用UE4开发VR内容的初学者指南,其中也包含Epic Games提供的大量Blueprint及C++相关的文档资料。
  本文使用的硬件是HTC Vive,UE版本是4.11 Preview。要注意VR还是新平台,每次UE更新也都会添加新功能,所以建议尽可能使用最新版本。
  几个比较好的学习网站包括Oculus官网,UE官网的VR文档以及子论坛。
  可以在我的GitHub上获取VR Templates项目以快速上手。这些模板目前都在开发中,包括Blueprint及C++的版本,拥有各种相机和运动控制的功能,并且后续会内置到编辑器中。

一、设置VR设备
  此步骤要先确保你的头显设备是可以正常工作的。如果Vive出现问题,可以查看这里的问题集锦。
  UE4支持所有主流的VR设备,并且创建VR项目不需进行太过复杂的设置。只要确保在Edit > Plugins下加载了与头显设备所匹配的插件即可。
 

  在启动编辑器之前要确保VR软件是运行状态,Vive的VR软件就是上图的SteamVR应用。
  对于Vive:一旦启动编辑器,SteamVR状态可能显示为“Not Ready”,这表示可能有内容重叠并防止Compositor屏幕运行帧率超过60帧,从而导致抖动和眩晕。关于该问题的更多信息可查看问答版块。下一代的Vive设备会通过直接显示模式解决这个问题。

 

二、启动VR预览
  只需在Play下拉列表中选择“VR Preview”即可直接测试VR内容。默认情况下头部追踪就可以正常工作,不需对已有项目或模板做任何修改。本文后续部分会详细讲解如何加入运动控制器及重置原始控制器等新功能。

 

三、VR最佳实践
  VR相对来说还是未开发的领域,每天都能学到开发相关的新东西。Oculus和Epic Games均设置了最佳实践指南,开发VR游戏的过程中建议随时查阅这些资料。
四、使用Blueprint制作VR内容
  在Blueprint中制作VR内容非常简单,无需做过多设置。
  可能会用到Camera组件和一两个Motion Controller组件。默认情况下Camera已经设置为支持HMD,如果想禁用头盔的旋转只需禁用组件属性中的“Lock to HMD”即可。
  下图是Blueprint中可用的组件列表(不完全包含):

 

  重置HMD的位置及朝向(可选Y轴偏移):

 

  使用VR时选择性启用功能可以简单地检测HMD是否可用:

 

五、SteamVR Chaperone
  Chaperone组件是SteamVR专用的,且很容易碰到软边界。软边界是以一个围绕着HMD校正原点的向量数组表示的。向量的Z分量值为0。在Blueprint中可以像使用其它ActorComponent一样使用该组件。

 

六、设置Motion Controller
  官方文档很好地介绍了Motion Controller设置及输入处理,如果你的VR设备支持Motion Controller,建议阅读这些文档。
  如果在对齐Motion Controller和相机时遇到问题,可以使用SceneComponent作为“VROrigin(VR原点)”,这在根组件锚点位置很特殊时格外有用。

 

七、使用C++制作VR内容
  因为4.11的Blueprint并未包含所有功能,如果想使用一些高级的自定义设置,就需要深入了解C++来调整。查看IHeadMountedDisplay.h文件了解可用的函数。也有些增加了新功能的插件如SteamVRChaperoneComponent ,但只支持一种设备。

八、需要包含的模块及头文件
  如果想通过C++访问HMD功能,需要在解决方案的ProjectName.Build.cs文件中包含“HeadMountedDisplay”模块。下面是VRFirstPerson项目的生成文件示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using UnrealBuildTool;
  
public class VRFirstPerson : ModuleRules
  
{
  
public VRFirstPerson(TargetInfo Target)
  
{
  
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
  
/* VR Module */
  
PrivateDependencyModuleNames.AddRange(new string[] { "HeadMountedDisplay" });
  
// ...
  
}
  
}

  使用HMD功能或Motion Controller组件,需要包含以下头文件:

1
2
3
4
5
/* VR Includes */
  
#include "HeadMountedDisplay.h"
  
#include "MotionControllerComponent.h"

九、性能顾虑
  为了让整个VR体验更流畅,游戏运行帧率需要达到75hz(Oculus DK2)甚至是90hz(HTC Vive及Oculus CV1),这取决于设备。游戏运行时在控制台输入“stat fps”或“stat unit”(信息更详细)可以查看游戏当前帧率。

十、CPU分析
  游戏可能会遇到CPU或GPU瓶颈,要找到问题所在比较快的办法是使用“stat unit”。从当代游戏和引擎复杂度来看几乎无法准确判断游戏性能瓶颈所在,所以要借用工具来处理!

十一、GPU分析
  按下Ctrl+Shift+,键或在控制台输入“profilegpu”即可查看当前帧所消耗的GPU时间。该命令会打印出GPU消耗的准确时间,可以从中判断使用VR时帧率上的主要负担(常见原因是开启抗锯齿)。

 

  在做分析时可能会卡在那些因项目或场景导致的本身就消耗很大的功能上。比如你可能要用到半透的体积光,但即便在不用时它也会为场景带来消耗。这都需要你自己真对项目来测试并权衡。
  FATED的开发者们列出了几个VR优化的小技巧。其中提到的有禁用HZB环境光遮蔽(r.HZBOcclusion 0)、运动模糊(r.DefaultFeature.MotionBlur=False)及Lens Flares (r.DefaultFeature.LensFlare=False)。这些命令不会存在于多个会话,所以需要在/Config/DefaultEngine.ini配置文件中添加,虽然在Edit > Project Settings… > Rendering下也可以进行设置。

十二、Instanced Stereo Rendering
  最新发布的4.11引入了新功能Instanced Stereo Rendering,看看下面的视频:


  “基本上,利用硬件实例化地绘制双眼,只需一次DrawCall及进行一次渲染循环。这可以大大减少渲染线程的CPU时间消耗,并改善GPU性能。《Bullet Train》就节省了约15~20%的渲染线程时间,及7~10%的GPU性能改善”,Ryan Vance说道。
  在4.11货更高版本启用该功能,只需勾选Project Settings界面Rendering下的“Instanced Stereo”选项即可。

 

十三、禁用消耗大的后期处理
  有些后期处理效果对于VR是非常昂贵的。例如抗锯齿和TemporalAA。
  要在场景中禁用某些后期处理功能,可以在Edit > Project Settings > Rendering下设置。在post-processing volume中也可进行设置,但它会覆盖在下图指定的设置。

 

十四、降低场景复杂度
  当代硬件很难满足VR平台的90FPS。你可能需要重新评估之前的限制并看看场景复杂度,像动态阴影、大气雾效及多边形网格等是不是过多。
  最大限度提高性能很重要的一点是尽量减少过度绘制。很多半透表面或粒子效果都会导致帧率过低。在ViewPort中按下Alt+8(默认视图下按Alt+4)即可查看当前场景的Shader复杂度和场景中过渡绘制的地方。看看下图可以了解大气特效对帧率低影响(绿色=好,红色=差,亮白色=非常差,每个像素约有2000个着色指令):

 
 
  蛮牛酱表示,上面一部分是使用技巧,一部分是优化技巧,其实优化对于很多游戏来说都是相通的,不只针对VR。
 腾讯GAD游戏程序交流群:484290331Gad游戏开发核心用户群

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论