【译】从虚幻引擎4开启你的VR之路
【译】从虚幻引擎4中开启你的vr之路
这个教程针对的是每一位想用UE4开发虚拟现实工程的人。包括设计图、c++、性能考虑还有如何在UE4中设置VR工具箱。
我十分推荐用最近的虚幻引擎4版本因为每一个新的版本极大的改进VR的性能。
有一些比较好的参考地点是官方视觉论坛,官方VR文档,还有虚幻引擎VR子论坛。
虚幻引擎4.13有一个在设计图中制作的新的内建VR模板。想看更多信息请看我的VR模板向导。
设置你的VR设备
对于这个教程我假设你已经成功的安装了头戴显示设备。(如果你没有的话请看头戴显示器设置或HTC vive pre设置)。万一你在设置vive中遇到困难,我觉得这个寻找故障向导应该是很有用的。
虚幻引擎4支持所有主流设备这样你在为你的工程设置VR的时候就不会会遇见很多麻烦事。你只需要确保edit>plugins下面加载了正确的HMD(头戴显示设备简称)插件。这里有一些性能问题需要考虑,我们在后面会谈到。
如果你用的是HTC的vive设备和steamVR app,在你启动编辑器之前确定你的VR软件是在运行状态。
启动VR预览
测试你的VR设置是非常简单的,只需要从play下拉菜单选择“VR预览”就行。默认情况下头部跟踪将会马上工作而不需要对工程或模板做如何改变。在教程后面我将会详细说明如何添加另外的特色的。比如运动控制器还有如何重置原点等。
VR最好的练习方法
VR仍然是一个相对未探索的领域,而且我们每一天都在开发中学习新事情。奥库还有史诗游戏都有设置最佳实践指南,我推荐你去通读它们而且在VR游戏开发中也要一直记着它们。
在设计图中使用VR
在设计图中使用VR是非常简单的,你不需要设置太多。
你需要一个相机组件还有一两个运动控制器组件(可选)。默认情况下你的照相机已经被设置为支持HMD的了。如果你想失能跟随HMD旋转功能,你可以在组件属性中取消勾选“Lock To HMD”。关于更多运动控制器的信息你可以去本教程底部看到或者去官方文档看如何设置运动控制器。
这是一个设计图中的可用节点列表(不详尽的)。
复位你的HMD的位置还有原点。
使用VR的时候在有选择的使能特点窗口你可以简单的检查到你的HMD是否被使能了。
SteamVR 监护人
监护人组件是专门针对SteamVR的,它可以很轻松的进入软界限。软界限是用以校准的HMD原点为中心的向量数组来表示的。向量的z分量一直是0.你可以把它像其他动作组件一样加进你的设计图中。就像下面一样。
SteamVR监护人组件
为了在c++中用监护人组件,首先你要打开ProjectName.Build.cs并添加“SteamVR” 模块到PrivateDependencyModuleNames数组中,看下面例子:
using UnrealBuildTool;
public class VRFirstPerson : ModuleRules
{
public VRFirstPerson(TargetInfo Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
/* VR Required Modules */
PrivateDependencyModuleNames.AddRange(new string[] { "HeadMountedDisplay" , "SteamVR" });
}
}
设置运动控制器
官方的文档对于运动控制的设置还有输入处理介绍的很好,所以如果你的VR设备支持运动控制器,我推荐你跟随那篇文档去做一遍。对于一个实际的例子可以看我的git hub上面的VR 模板。
如果你无法将运动控制器与相机对齐,你只需要使用一个“VR原点”的场景组件就行了。尤其是在人物设计图的根组件中有不期望的元素比如胶囊体时这会很有用。
在c++中使用VR
对于4.11版本设计图并没有展现所有的功能。如果你想使用更高级的自定义设置,那就需要挖掘c++去调整一些设置。 可以去IHeadMountedDisplay.h 看那些可用函数。一些插件会添加附加的特性像 SteamVRChaperoneComponent,但是这只针对某一特定的设备。
需要的模块还有头文件
如果你希望通过c++获得HMD的特点。那么你应该在ProjectName.Build.cs(在解决方案资源管理器下)文件中包含“HeadMountedDisplay” 模块。这里有一个从VRFirstPerson project 中得到的例子。
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特性或者运动控制器组件,一定要确信你包含了一下头文件。
/* VR Includes */
#include "HeadMountedDisplay.h"
#include "MotionControllerComponent.h"
性能考虑
为了让整个VR体验看起来流畅你的游戏应该运行在75hz(Oculus DK2)甚至是90hz(HTC Vive and Oculus CV1) ,这是有具体设备而定的。当运行游戏的时候你可以在控制台中的“stat fps”或者“stat unit”中看到帧率。
Cpu性能分析
你的游戏 有可能成为cpu或者gpu的负担,这个只有通过测量才能弄清楚(一个快速的方法是使用“stat unit”)。随着游戏和引擎的复杂程度提高,对于这个游戏的瓶颈约束做出好的猜测是不可能的。所以用你手头的工具开始测试吧。关于UE4 Bob Tellez写了一个关于cpu性能分析的博客。这是一个上手的好地方。
Gpu性能分析
为了捕捉gpu时序中的一帧,你可以按 Ctrl+Shift+,或者在控制台中输入 “profilegpu”,这个命令会存储gpu精确的时序图。当使用VR的时候,你会发现某一特定的过程对帧率有极大的影响。(比如环境光吸收)。
Gpu性能分析和表现性能分析文档是很好的学习性能分析的地方。
当你性能分析的时候你可能会对一些花费性能的特性感到困惑,这取决与你的工程。比如你虽然没有用半透明的体积光源但它却依然耗费了一些静态资源。你可以看这一篇 AnswerHub post by Daniel Wright来获取更多信息来关掉这个特性。你需要做的就是不断的测试和改进,没有任何一种配置是对任何工程都是完美的。
在寻求最优化的VR中开发者必然会学习到大量的技巧。他们提到的一些的例子有失能HZB遮挡剔除(r.HZBOcclusion 0),运动模糊(r.DefaultFeature.MotionBlur=False) ,还有镜头光斑(r.DefaultFeature. LensFlare=False).这些命令并不会一直存在。所以你应该在/Config/ DefaultEngine.ini 配置文件中添加它们。这些设置在edit> ProjectSettings…> Rendering也可以找到。
另一个巨大的优化就是考虑实例化的立体声渲染,我们接下来将会讨论。
实例化立体声渲染
最新的4.11版本包括了立体声实例化渲染,点击下面的视频可以知道那是如何工作的。
“我们基本上都是通过一个绘画函数调用在渲染循环中用硬件实例同时画两只眼睛。这将会极大的减少cpu线程时间并改善gpu性能,我们可以看到15-20%的cpu性能改善和7-10%的gpu性能改善”。
在4.11中为了使能这个性能,可以去工程设置渲染目录的的实例立体化去设置。
失能繁重的后处理程序
在vr中一些后处理程序的效果代价是很大的比如环境光吸收。其他的一些可能是非常烦的比如镜头光晕,因为它们会打破你的沉浸感而明显感觉到你是在通过镜头看东西。下面这些是很简单的例子来看它们是如何影响你的游戏的性能的。
为了从工程的领域失能后处理程序,你可以去Edit > ProjectSet tings > Rendering。成批后处理也可以用相同的方法。记住,成批后处理可以覆盖下列工程设置。
减少场景复杂度
基于现在的硬件要想保持90帧每秒的帧率还真有点难。你可能需要重新审视之前的传统限制,看你的场景复杂度比如动态阴影,粒子烟雾效果还有多边形网格。
减少透支对于获得最佳性能是非常重要的。很多半透明表面或者粒子效果会很容易使帧率下降。为了使现在的阴影复杂度可视化你可以按下Alt+8。按下Alt+4可以恢复正常模式。看下面的图片你就会知道粒子效果会如何影响你的帧率。(绿色是好,红色是坏,白红是非常坏大约每像素2000着色器指令)。
动态阴影和光线对性能也有巨大的影响。尽可能多得烘焙更多的光线,这样就能尽可能减少每一帧的代价。
渲染命令列表
这个卓越的talk by Nick Whiting and Nick Donaldson包括了很多gpu优化的按钮。在下面也将它们列出来了。尽管如此我还是推荐你去看他们的讨论因为那个包含了大量关于虚拟现实基本的信息
为了测试这些命令,首先打开控制台。一旦你选定了一个将要被应用在你工程中的命令,你可以把它们包含在你的配置中,在/Config/Default Engine.ini under [/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.TranslucentLightingVolume 0
r.TranslucencyVolumeBlur=0
r.TranslucencyLightingVolumeDim=4
r.MaxAnisotropy=8
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.FastBlurThreshold=0
r.SSR.MaxRoughness=0
r.SSR.Quality=0
r.rhicmdbypass=0
r.TiledReflectionEnvironmentMinimumCount=10
疑难解答
HTC Vive Troubleshooting Guide
pecific(无PRE版本):一旦你启动了这个编辑器,SteamVR就可能会声明没有准备好。这意味着可能会重叠或者使屏幕图像合成器在60PFS以上时出现抖动还有导致眩晕的运动。关于这个问题的更多信息还有变通方案可以在 AnswerHub Thread上面找到。Vive设备的下一代产品将不会有这个问题,因为他们用了直接模式来显示。因此,你必须更新你的图像驱动以支持直接模式。
参考文献
希望这篇文章将开启你的虚拟现实工程之旅!
如果你有问题或者感觉我漏掉了一些重要信息,请在下面留言以让我知道。如果想要联系,请点我的Twitter。
链接>;已获得作者翻译授权。