虚幻引擎4——VR开发入门

发表于2016-10-10
评论0 8k浏览

翻译:袁笠凯( °Sinmere) 审校:顾亮(brownfish)


现在人们围绕虚幻现实的话题越来越热,同时每天越来越多的人加入到VR开发中来。本指南特别适用于那些使用虚幻引擎4开发VR的人使用,来自包括Epic Games的官方文档不同资源的整理,涵盖了蓝图和C++两部分内容。本文,我使用HTCVive和虚幻引擎4.11Preview版本进行开发。请注意,VR仍然是一个相当新的主题虚幻引擎每一个新版本中都会增加些新功能,所以强烈建议尽可能使用最新版本。

有几个不错的地方值得去看看:Oculus官方论坛虚幻引擎VR官方文档以及虚幻引擎论坛VR板块 

如果您正在寻找VR模板让你立即开始,可以去my GitHub。这些模板是目前正在制作摄像机以及运动控制器各种功能,并且同时支持C++和蓝图。现在这个项目还在制作过程,以后将会作为编辑器的内部模板进行使用。

 

设置你的VR设备

在本指南中,我假设你已经成功地安装了选择的头戴显示器设备。如果你在使用Vive过程中出现问题,我这篇故障排除指南是会有帮助的。

虚幻引擎4支持所有主流的设备,因此没有任何去麻烦设置你的VR项目。只要确保你的头戴显示器的插件在Edit > Plugins目录中被正确加载就行。

在您启动编辑器之前确保您的VR软件已经运行,如果使用的是Vive,其应用程序是SteamVR

特别在Vive: 当你启动编辑器的时候SteamVR或许会显示“Not Ready”,则表示有某些重叠使得VR的混合屏分辨率不超过60FPS导致出现抖动和动作不连贯。关于这个问题的更多解决方法可以在AnwserHubThread上找到。在这些Vive设备使用直接模式再启动设备的时候就不会出现这个问题了。


启动VR预览

测试你的VR设备非常简单,只需要选择PLAY中下拉按钮中的“VR Preview”就可以。默认情况下,不需要改变你已有的项目或模板,头部移动跟踪效果也会即刻生效。我会在接下来的指南中讲到更多关于如何添加像运动控制器和原点设置这些扩展功能。

 

VR最佳实践

VR仍然是相当新兴的领域,随着每天的发展我们不断学习新的东西。 Oculus Epic Games都提供了最佳实践指南,我建议你最好通读一遍并在开发VR游戏的过程中细细体会。

 

使用蓝图开发VR

使用蓝图开发VR是非常简单的,你不需要大量设置工作可以开始。

你会需要一个CameraComponent(摄像机组件)和一到两个Motion Controllers Components(运动控制器组件)。默认情况下,你的摄像机已经添加了HMD支持,如果你希望关闭HMD转向变化效果,可以在组件的属性设置中找到“Lock to HMD”进行关闭。更多关于运动控制器的信息,你可以跳至指南后面的部分进行了解,或者马上查看官方文档 SetupMotion Controllers

以下是不完全的蓝图可用节点列表

 重置你的偷窥位置或方向(可选择设置偏移量)

当你在使用VR需要选择一些功能时你可以容易的检查HMD是否工作。

 

SteamVR Chaperone

Chaperone组件是专属于SteamVR的组件,可以很方便去访问软边界。软边界是以HMD为原点(000)校准的向量数组。其Z轴向量值始终为0。如下图所示,你可以添加这些组件像添加ActorComponentBlueprint一样。

 

设置运动控制器

官方文档对于运动控制器以及输入处理介绍的很清楚,如果你的VR设备支持运动控制器我建议你照着其官方文档一步一步去设置。你可以在my Github VR模板找到实际的例子。

如果你在使用相机校准运动控制器的过程中遇到麻烦,只需要把一个(场景组件)SceneComponen当做“VR原点在根组件处于一个意外的坐标点,象是(封装组件)CapsuleCompoent在角色蓝图中的时候,这种方法尤其管用。

 

C++实现VR

由于4.11版本并没有把所有功能都在蓝图中提供,所以如果你尝试实现些高级定制功能,你需要深入C++去进行一些设置。找到IHeadMountedDisplay.h看下文件里一些能有效利用的函数。某些插件如SteamVRChaperoneComponent增加一些额外功能只能针对单个设备。

 

必要的模块和包含文件

如果你想通过C++访问HMD,你需要在ProjectName.Build.cs文件包含“HeadMountedDisplay”模块,这些你可以在你的Visual Studio解决方案资源管理器中找到。以下使用的是VRFirstPersonproject构建文件的例子

 

1
2
3
4
5
6
7
8
9
10
11
12
13
using UnrealBuildTool;
public class VRFirstPerson : ModuleRules
{
    publicVRFirstPerson(TargetInfo Target)
    {
        PublicDependencyModuleNames.AddRange(newstring[] { "Core", "CoreUObject", "Engine","InputCore" });
 
        /* VR Module */
        PrivateDependencyModuleNames.AddRange(newstring[] { "HeadMountedDisplay" });
 
        //...
    }
}

要使用HMD功能或运动控制器组件,请确保您包括下列头文件。

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


性能注意事项

为了VR体验全程更舒适,你的游戏需要维持在在75赫兹(Oculus DK2)或甚至90赫兹刷新率(HTC VIVEOculus CV1)运行,这取决于的设备。在运行游戏的时候你可以在控制台输入stat fps”或“stat unit”(更详细的分类)去了解当前的帧率。

 

CPU分析

你的游戏会受限CPUGPU性能,你需要找出那些你需要测量的数据。(一个快速的方法是用“statunit”)。基于游戏以及引擎的复杂,现有信息是几乎不可能去很好预测你的性能瓶颈,所以你需要使用合适的工具。Bob Tellez写了一篇使用虚幻引擎4时的CPU分析的博文,那是个不错的入门。


GPU分析

按下Ctrl+ Shift + ,或在控制台输入“profilegpu”可以获得每一帧的GPU时序图。该命令可以准确测量GPU时序,在使用VR的过程中,你会发现某些处理进程会对帧率造成很大的负担(AmbientOcclusion就是一个很常见的例子)

GPU分析性能分析都是了解如何分析你游戏的好方法。

尽管进行了性能分析,你也许还是会栽在场景或项目中里那些耗费性能的其他特性上面去。比如Translucent LightingVolume,你可能不需要它,但是即使不实用它,它也会在你的场景中增加静态成本。查看这篇文章AnswerHub post by Daniel Wright 获得更多信息来学会如何禁用这个功能。所有这一切都需要你来测量和测试,没有任何一个的配置能是适合所有项目。

FATED的开发人员列出了一连串化VR需求,他们提到了几点,比如禁用HZB遮挡剔除(r.HZBOcclusion0),运动模糊(r.DefaultFeature.MotionBlur= FALSE)和镜头眩光(r.DefaultFeature.LensFlare= FALSE)。这些命令不能在多重会话中维持状态,所以你应该增加(或搜索和替换)设置它们在你的/Config/DefaultEngine.ini配置文件。虽然大多数这些设置都可以通过Edit > Project Settings… > Rendering.

另一个显著的优化那就要提到立体渲染实例化,我们接下将讨论它


实例化渲染

(Ryan Vance说:“基本上,我们可以利用硬件实例化,通过单一绘制以及渲染循环来绘制双眼。这明显减少了CPU渲染线程时间,同时提升了GPU性能。在渲染线程上,Bullet Train可以实现CPU在渲染线程15-20%的提升,GPU性能7 – 10%的提升。”

4.11以上版本启用此功能,要进入项目设置然后在“渲染类别”下找到“Instanced Stereo”

 

禁止消耗性能的后期处理

某些后期处理效果在VR计算成本很,比如Ambient Occlusion。在VR可能还有其他像镜头眩光造成打断沉溺场景呈现后,不得不去使用摄像机替代,这样令人讨厌的体验。这些是非常简单的例子去开始查看这些是如何影响你的游戏和画面表现的。

要在项目层面禁用某些后期处理功能,可以按照Edit > Project Settings > Rendering。你可以在调整后期处做同样的事情。请记住,调整后期处理量可以覆盖以下指定的项目范围的设置。

 

减少场景复杂性

如果目前硬件很难去让你达到FPS90的效果,您可能需要重新检查以前的设置限制,并查看场景的复杂性,比如动态阴影,大气烟雾效果和网格多边形数。

最大限度地减少透支是非常重要的减少开支的方法。许多半透明表面和/或粒子效果很容易使你的帧率出问题。可以按Alt+8的视口让当前着色器复杂度/透支变得可视化(按Alt+4,返回到默认视图)。从Elemental Demo底部图片可以了解环境对你帧率影响多少(绿色=好,红=坏,白热化=极坏像素约2000着色器指令)

动态阴影和灯光对性能有着很大的影响了。尽量多的使用光线烘培,让你每帧的成本尽可能的低。


绘制命令列表

出色的 talk by Nick Whiting and Nick Donaldson 一文中包含了用于VR GPU优化的一系列渲染命令,你可以在下面找到这些命令列表,我通常建议你观看他们讨论的时候跳过那些关于虚拟现实的大量基础技术。

为了测试这些命令打〜(波浪号)打开命令控制台,将命令设置到你的项目中,你可以将他们一次到你的配置文件中,添加它们/Config/DefaultEngine.ini  [/Script/Engine.RendererSettings].下面。提示:确保这些命令在你添加之前是否已经存在


§  r.SeparateTranslucency=0

§  r.HZBOcclusion=0

§  r.FinishCurrentFrame=1

§  r.MotionBlurQuality=0

§  r.PostProcessAAQuality=3

§  r.BloomQuality=1

§  r.EyeAdaptionQuality=0

§  r.AmbientOcclusionLevels=0

§  r.DepthOfFieldQuality=0

§  r.SceneColorFormat=2

§  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

§  r.SSR.Quality=0

§  r.rhicmdbypass=0

§  r.TiledReflectionEnvironmentMinimumCount=10

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

0个评论