快捷导航
查看: 1225|回复: 0

谢添敏 《使用虚幻引擎制作VR内容》

[复制链接]

今天的题目就是,《使用虚幻引擎制作VR内容》。稍微介绍一下,我们公司叫Epic Games。Unreal Engine是我们一个引擎产品,除了引擎以外,Epic Games还做很多游戏产品,比较知名的是《战争机器》。
写这个标题主要是希望大家了解到,其实游戏引擎并不是一个必须要用的东西,然而如果想更快更好地做游戏,使用游戏引擎是一个很好的工具。那这个工具本身,有简单的,也有难的。市面上有Unreal引擎,也有Unity引擎,还有更多其他的,比如说CryEngine、Cocos。各个引擎在各自的领域都有自己优势,那么Unreal呢,我们是面向游戏开发的,其实更早以前,我们是面向PT上的三维大作,以及一些主机游戏,现在渐渐地看到VR,在面向影视制作、手游制作,这是引擎的一些发展。

如果没有游戏引擎

如果我们没有游戏引擎的话,我们怎么来做东西呢?那开发者可能会直接面向平台的工具,比如windows里,开发者可以直接使用微软提供的DirectX,当然也可以使用OpenGL,包括现在渐渐出来的一个叫Vulkan的接口。那Linux上也是OpenGL和Vulkan也是可以用的。console的话,大家就去找各自微软和索尼提供的一些SDK吧,我在做PS2游戏的时候,用Sony的SDK非常的像OpenGL的接口,但现在PS4我还没有仔细的看过它的SDK,但我相信应该也是一个类似的面向系统的接口。
对于硬件,因为今天是VR内容,所以我就不讲别的硬件了,主要是装VR硬件的各个SDK。Oculus要注意的是,它的头显和声音,分了两个SDK需要去下载。Steam VR其实就是HTC的一个VR的接口,但是SteamVR其实是基于叫Open VR的一个公开的标准吧。其实不光是HTC,如果用的话也可以用类似的,其实国内有很多VR厂商,可能会用,或者说开始在用。那这都是硬件上的选择。那安卓的话,面向DayDream的话,以后安卓里面都会带面向移动设备VR的开发包吧。苹果我还不是很确定。那如果你不用Unreal的话,就要去下载它们各自的工具。使用Unreal的话,其实这些工具Unreal就自带了。Unreal本身是跨平台的,你可以直接在Unreal上为各个平台开发内容,然后面向具体的平台做部署打包的版本的制作,这个版本就可以跑在你的目标平台上。

游戏引擎的作用

做游戏开发的人可能会知道,引擎本身可以制作跨平台的内容,当然,这个内容为手机做还是为PC做,作为内容制作者本身肯定是要自己想多一点,比如说为PC做的内容,可以推十万个面进去,为手机做的内容,就不能推十万个面进去,这十万个面,如果你要打包到手机上的话,Unreal是不会帮你减到一千个面的。所以关于目标平台,内容量是要自己控制的Unreal负责把内容整合到更多平台,还有目标平台的一些底层的东西,以及Unreal会去整合开发流程的上下链,这是什么意思呢?比如说美术使用的是MAYA/MAX,比如说QA使用的测试工具,这些其实都是可以围绕在Unreal周围的,那包括编译工具、发布工具、测试平台Unreal都会做整合,包括source control其实Unreal都做了内置整合,让大家更快的工作。而不是说,引擎是一个独立的存在,用MAX/MAYA做好以后,还要为Maya写一套脚本,把我的MAYA导到引擎一样的格式上,再导入。这些步骤Unreal工具链上都已经很完整了。
还有工作流程的整合,就是对游戏开发分工,主要是策划、美术和程序。游戏圈里有个很流行的段子,说一个美术坐在房顶上要跳楼,策划在下面说:“放心,我再也不改了。”这个段子其实一定程度反映了游戏圈不同工种之间,在工作衔接上的一些矛盾和冲突。那Unreal引擎本身已经定义了一些工作的方式,比如说策划是工作在文案上的,还需要为一些游戏设计内容负责,策划可以直接工作在引擎上对游戏内容做调整。那大部分美术是工作在MAX/MAYA、Photoshop或者zbrush之类的美术软件里,Unreal也需要这些美术工作在引擎上,把他做的内容导入到引擎里,直接看到引擎中最终的效果。而不是说,MAX/MAYA里面是这个效果,那么程序要在引擎里帮我调到这个效果。对于和引擎结合的最紧密的程序来说,我们引擎本身是完全开源的,程序可以拿到所有的源代码,包括引擎核心、周边工具,程序就可以为引擎做一些定制。当然定制的程度取决于团队本身的能力。其实在Unreal引擎里面,这样的话,其实会有两个非常重要的工种,一个叫做TA,他在引擎中做美术的工作,但是他非常懂技术,他需要了解引擎中的材质、动画的衔接之类的,都需要TA这样的角色来执行。另一个角色叫labeldesigner,label designer本身是属于策划的一个分类,但他大部分时间都工作在引擎上,为游戏的关卡做设计、各种模型的摆放,关卡中的灯光通常是由美术做的,但关卡中的逻辑,比如说玩家走到这个地方的机关,走到那个地方开一扇门,游戏的胜利或者失败,很大程度上这是和label designer相关的。
Unreal的结构

现在讲一下Unreal的结构,因为很多同学在用Unreal引擎的时候,觉得Unreal很庞大、很复杂,没有一个很好的切入点。那我今天讲的内容,其实是希望帮大家建立一些概念,这样用的时候可以更顺利。
Unreal非常模块化,我们在引擎中把这个模块分成好几部分,其实模块本身就是按照目录来拆分的,最主要的一个我们叫runtime在runtime里面它包含了渲染模块,包括那个文件读取,这是IO的模块,现场模块等等,这些模块,无论是引擎运行还是编辑器运行,都是需要用到的。第二个主要的模块,我们叫编辑器模块,那编辑器模块只在开发阶段,最终的产品是不需要编辑器的。比如说在编辑器中导入一个MAX模型,导入模型本身这个功能在用编辑的时候是需要的,但最终你的产品是不应该包含这个导入的模块,这样可以使得最终产品是比较精简的。
除了runtime和editor以外,我们还做了一些开发工具、支持工具、第三方工具的拆分。开发工具和支持工具,可能第一次会有点混淆,这里就可以详细给大家解释一下,开发工具有一部分属于开发阶段的,但有一部分是属于runtime的,因为很多开发工具是需要在运行时能够被执行到。比如像ShaderCompiler其实只会在编辑器阶段使用,但比如说面向windows平台的Shader model 5.0,编译的Shader,这个编译的过程只有在开发的时候需要,但编译的结果在运行的时候是需要能够被读出来的,并且送到显卡上去执行。支持工具其实就是面向一些引擎的周边功能,大家知道引擎可能会有,做好之后可能会编光照,可能会做各种支持,比如说我们有一个工具可以在前端启动,并且monitor所有你的机器上的引擎线程,并且去和局域网下其他的机器做一些交互,包括有一些工具可以直接帮大家在Windows平台下做IOS的一些打包,并且部署到IOS上,这些都是属于支持工具的这一块,而且这个工具是开源的,大家都是自己可以去改,那不改的话,其实直接用也是可以的。那这个东西其实和最终的产品的runtime是没关系的。最后就是第三方的工具,做开发引擎的可能都知道,像一些JPG的东西,全都是属于第三方的,其实是需要引入第三方的功能去做。然后Unreal还有一个很特别的东西,我们叫做插件。其实每个插件本身都是一个模块,插件为我们提供了一个可以由外部为Unreal开发额外功能的可能性。这是我刚才说的一个比较特殊的模块,叫插件,上面这三个是我们标准模块的,在引擎目录中的结构,其实它主要分为Private、 Public的目录,和Build.cs的一个编辑的C#文件,那这个首先是引擎在启动的时候会去扫描自己目录下所有的Build.cs文件,可以先把每一个模块加载起来,而且Unreal整个编译结构会依赖于Build.cs文件去生成solution文件和project文件,这里大家一定要记住,就是solution和project文件是临时生成的。Public里面应该只放所有的C++的头文件,把这个模块需要暴露的接口暴露在外面,那Private其实就是C++,实际上当然也可以包含自己的private的文件。那对于其他形式的平台,可能就会需要,我们其实也提供把所有的文件最终实现都打包在exe文件里面。插件会多出来一些目录,Source目录下其实跟标准模块是一样的,多出来的目录主要是Binaries和Resource,那Resource的部分其实是插件中可能用到的一些资源,或者说是图标,举例来说,比如说我们做了一个VR的硬件,给引擎做了一个VR的硬件插件,那么这个VR硬件插件里面,假设它用到的一些很独特的系统级的菜单画面,我不知道大家有没有打过Xbox,不管是Xbox还是PS,你可以在任意时候呼出一些系统菜单,显示console主机上的一些东西。那对于VR来说也是一样的,如果有这个插件的话,你可以把这样一些系统菜单的东西,做成资源放在这样的资源目录里面。Binaries的话,我们要求就是,大家如果做插件的话,发布这个插件需要在binaries里面提供至少64的这样一个版本。当然我们其实也应该是提供所有的插件源代码,使所有用户在用这个插件的时候可以在其他平台上完成编译,但有的时候插件的发布方可能未必会提供源代码。
这里还是一个对引擎模块的解释,那橙色的是最终打包到引擎里看的,蓝色的是开发阶段,runtime后会去掉。刚才我说的所有插件和模块都是基于引擎的,因为引擎本身,大家在做项目的时候,引擎是提供了一个对项目的支持,那项目本身在我们这里也是以模块的形式存在的,在UE4中,我们把项目和引擎都拆开来了,这样的话,就是比如说现在你自己做的一个项目,定义了两个模块,这两个模块可能一个是基础的game play,另外一个可能是面向自己的在线的功能模块,那么当引擎升级的时候,可以把引擎的一整块给替换成一个更新的引擎版本,而不用去替换上面的东西,这样的话,会使得升级变得很方便。当然如果有的团队在开发过程中对引擎本身做了一些改变的话,可能会需要自己重新merge一下,或者在新的引擎上把自己的修改再写一遍。

VR内容

我们先来看一下,Unreal引擎在VR上的,做的一些尝试和几个不同阶段。最早的时候,其实VR就是双眼的立体渲染,其实最简单来说的话就是,把画面渲染两遍,然后左眼画一遍,右眼画一遍,那么其实最早的时候,我们就是在引擎中做了这个尝试,然后做了一个立体渲染,并且可以使,就是你的头部晃动去移动你的视线的角度,那当时的这个视线角度是通过陀螺仪来做的,所以其实只有三个自由度,就是其他三个自由度的转动。后来我们提供了一个六个自由度,原本通过陀螺仪也是可以做前后左右上下平移,做到六个自由度的,但是呢,如果只通过陀螺仪的话,平移自由度的识别会非常的差。大家想象一下,陀螺仪是通过加速度来做的,所以当你平移的时候,如果你移的很慢很慢的话,可能陀螺仪的精度不够,所以体现不出这个加速度。可能你移动了,比如说移动了20公分,但是画面里面的头并没有动。那当时做这个六自由度是因为Oculus出了一个sensor,可以通过反应来定位到你的空间位置,当时这个六自由度的demo是一个棋盘,当然戴着头盔可以通过转动,头的移动去观察棋盘上棋子的效果。再后来就是我们在VR中做的多人在同一个VR世界中的体验,其实也是一个游戏,那个游戏的状态是两个人,你可以在一起,也可以不在一起,demo名字叫沙发骑士,是两个人坐在沙发上,然后在茶几上有两个小人,可以互相用剑来砍,那小人是通过用户的手柄,像打游戏一样,然后你可以看到对方小人在桌子上,你有自己的小人可以在桌上砍他,同时你可以看到对方真实的头在虚拟世界中的位置和变化,这也是一个蛮有趣的东西,这个其实现在也在我们的launcher可以下载到,如果大家要做的话,也可以去参考,那我们放出下载,其实资源和源代码都是有的。之后我们又做了一个叫做showdown的demo,在那个demo中,我们尝试的是,VR中的移动,它那个移动是非常非常的缓慢的,像电影的慢镜头一样。最后我们做了一个叫《Bullet Train》的游戏,不知道有没有人体验过这个游戏。这是一个完整的,可以玩的,有体验的,可以开枪、打来打去,可以捡枪、可以换子弹的一个demo,大概十分钟到十五分钟,那这个demo其实,对我们来说只是用引擎来验证一下VR游戏的可玩性,以及制作的方式。

引擎对VR需要做哪些特性

那刚才我说了,引擎是帮助大家加速内容制作的这样一个工具。没有引擎的话,大家可以直接来做,那引擎又在这API上做了一些什么事情。
首先就是面向VR的一个性能优化,因为大家知道,VR的一个视线和传统的输出在显示屏上的这样一个画面是很不一样的,通常会有一些畸变,我们这里叫做一个Hidden Visibile Mesh,当VR整个畸变画面完成后,大家应该可以看到,VR是一个椭圆形的画面,对于单眼来说,那么在椭圆形的周围,四个角,包括四个边上都有一定范围的黑边,NVIDIA把这个黑边叫做17%,就是占它的14%,但其实具体是多少,可能不同的厂商有点不一样。那不管怎么样,会有很多的黑边会使得渲染性能耗费在没有必要的地方,在引擎中做的地方就是,我们会根据当时的,或者说是正在用的硬件,来自硬件SDK的一些信息,把这些黑边用一个Mesh给遮住,然后在渲染的时候,通过深度检测,把这部分Mesh后面的东西就不去画它,包括后面的上色也不去做,这个地方是可以省非常多的性能,而不是说我们渲染一个完整的画面,再把那个地方给去掉。第二个是即时立体渲染,我们叫做Instance SteroeRendering。第三个叫延迟输入捕获,延迟输入其实是一个很有用的东西,通常来说引擎做游戏的话,都是一帧一帧来做的,那每一帧都是在这一帧的开始的时候获取输入的信息,然后再把引擎通过一定时间的运算,再把这个运算结果送到渲染的计算性能上,最后去把渲染的画面present到眼镜的画面,或者显示器的画面上。那延迟输入就是说,我们在主游戏逻辑的线程计算完以后,再把计算结果送到渲染程序前,我们重新再去读取一下当前的硬件设备的角度和位置,这个时候用这个角度和位置送给渲染程序,让渲染程序根据,用这个时候的角度和位置去画这个画面,这个其实会提高非常,会节省很多时间,因为对于VR来说,大家都知道,说了很多关于90帧啊,20ms的延迟之类的东西。其实不管从软件硬件到显示设备,大家都在为最短的一个延迟做努力。那这是一个引擎为了这个地方去做的一小部分努力,使得这个延迟降得更低。还有一个就是关于畸变和反畸变的适配,因为不同的硬件厂商都会有不同的,就是最终它那个眼镜的畸变,包括Oculus现在发的最新的那个rift,以后都怀疑它会出不同的镜片,让一些近视眼的同学可以更好的使用它。现在都不能调整度数嘛,所以对于最终的硬件画面的话,其实是需要硬件告诉引擎,我的这个畸变的一些曲率啊,一些参数是什么,引擎会根据硬件SDK吐出来的这些信息做一个画面的调整。那像这些,如果自己做的话就会很困难,最后就是一个关于硬件的兼容,那这里想谈的就是,引擎其实我们以前做了很多优化,其实一直从13年开始就不断在做VR的优化,然而有些优化,比如说我们有个叫做time warping的一个东西,现在是引擎的软件层面,在CPU上跑的,那后来呢Oculus自己集成了,然后Oculus把这个功能移到了所谓的驱动层面上来执行,那引擎就不再需要成这个了,因为在驱动层面上执行起来会更有效率。那么引擎,发现你是Oculus硬件,可能就会把这个time warping的功能给跳过,然而这是一部分,就是以前引擎做的功能,向硬件的一个驱动层,或者硬件层的迁移,还有一个例子就是我们以前做了一个面向不同显示区域的一些分辨率输出的优化,那现在NVIDIA它们出了一个叫做multi sample revolution的一个特性,那当我们发现是跑在NVIDIA显卡上的话,我们就会把这个优化在引擎上做,不再计算,而是交给硬件来计算,但是呢,并不是所有硬件都会支持这些特性,所以我们仍然会把这样一些放在特性放在软件层做一定时间的保留,我们发现如果是非NVIDIA的卡,或者说是一些手机在跑的话,可能引擎仍然会做这样一些性能优化,以使得在CPU上的这样一个,计算性能得到比较好的一个解决。

VR接下来还在做什么?

这一点其实有很多人也在问,第一个问的比较多的是,一般叫做MR的视频拍摄,那这个东西其实是要求引擎里面有一个第三个camera,去把当前的画面绘制出来,第三个camera的位置呢,是由外部的一个camera来定义的,那在Vive上通常的实践是会接第三个手柄,然后用第三个手柄绑在一个camera上,通过手柄和camera定义一个位置,来把这个信息告诉引擎,引擎去画这个画面。这个画面的形式,比较简单的做法是,它会根据当前玩家头显的位置,就是头盔的位置,把引擎的画面分成前景和后景,然后把这个前景和后景都输出给外部的一个视频合成软件,一般用的是一个叫OGS的模型。那这个东西输出来以后,它在把外部世界中camera拍摄出来的真实的人,这个人通常是在幕布前的,把这个真实的人,从幕布中抠出来,再合成到引擎的画面里面。那这个功能现在是由Steam VR为Unity做的一个plugin。我们Unreal也在做这个事情的实现,将来可能会在,现在我们是4.12的版本,可能会在4.13就会放出来。第二个是我们叫做filmproduction的,一些公司用的比较多,它们会拿VR拍摄设备,360度地拍摄立体的画面,我这里就不再解释360度视频和VR视频有什么区别了,这是两个不同的东西。那在引擎中我们也提供了一个把引擎画面输出成VR画面的功能,那它实现的方式其实,引擎就是我们把三维的切成N个角度,这个其实是一个可变的参数,假如说我们把它切成36维,36幅画面的话,那么最后我们,一个画面会渲染10次,其实不止10次,可能是水平的10次,然后角度向上,再去渲染,角度向上,再去渲染。其实会渲很多很多次,那最终得到一个所谓的VR画面。因为,刚才说的稍微有一点错误啊,其实并不是,一个角度并不是渲一次,其实一个角度要渲两次,因为一个角度,它会有那个眼睛的视差,造成两个方向,如果渲一次的话,就是一个360度的画面,只有渲两次才会得到一个VR的画面,那这也是一个,我们认为VR,面向VR功能,正在引擎中会迭代的一个东西,这个是,也想告诉大家,如果有人用Unreal的话,可以期待一下这个功能。这是目前支持的平台,其实这里主要想讲的就是,一个Oculus,一个Steam VR,Steam VR就是HTC的,这里面有三星的,其实是面向三星的Gear VR,其实Gear VR也是属于Oculus的一部分。那面向这样一些VR产品,大家在做东西的时候,你不需要去考虑硬件底层是什么,你只需要把你的内容在引擎中实现,最后在输出的时候,选择你的目标VR平台,就可以得到一个可运行的版本。

如何获取引擎、如何使用引擎

获取引擎我们有两种方式哦,首先第一个方式,我们叫标准的发行版本,通过这个发行版本,就是下载到一个引擎的执行文件,就像所有的安装软件一样,可以把引擎装完就可以直接用了。那第二个版本叫做,引擎的源码版本。为什么我这里要把这两个东西分开来说,就是这两个东西其实面向不同的人群,面向不同的制作目的,下载有源码版本的话,需要自己去编译生成最终的一个二进制引擎的版本。那下载源码版本的好处是,可以对引擎做更自由的修改,做自己希望的调整。那在说到这个下载的时候,要稍微说一下用户协议,因为有很多人可能发现,很多人会把开源理解成免费,其实并不是完全免费,如果大家用的话,记得去看一下用户协议。我这里除了,我这里先讲一下源码版本大概,比较快的介绍一下源码版本,怎么样获取这个引擎。有什么问题?那我继续说。源码版本的话,就是首先我们有很多目标,做了很清晰的一个区分,一个是Debug,Debug的话,是所有的引擎模块最重要的模块,包括游戏模块,都是以Debug方式可以存在的。你可以直接去调试它。那DebugGame和Debug有什么区别呢?DebugGame只是说,自己的项目是一个Debug平台上的,可以调试自己的项目代码,但是引擎的代码是一个,一般叫做release,我们有时候也叫release吧,就是一个优化代码生成的。这样的话,引擎的执行效率会更高一些,这是对于不需要调试引擎的开发者来使用。那Development其实就是相当于一个release,所有的东西都是以优化的方式最后得以生成的,在调试的时候可能会看到一个错误,或者很多断点。Shipping的话,就是面向最终的一个产品发行的方式,这个方式下会删掉很多,就是中间文件,不需要的中间文件,包括一些代码,一些调试信息。Test其实是一个很接近shipping,但可以打开的一些测试功能,比如说你可以看你的帧数啊,什么的,就最终是面向shipping做一个最后的调整。然后我们还有一些区分其实,这里上面和下面两部分是一个两个维度,可以交叉起来的东西。<empty>就是最终生成实际的游戏,Editor是指,我生成的不光是游戏,还要生成我的editor。那这其实就是对应于我刚才说的,一个是,就那两个圈,一个是开发的一个版本行为,一个是最终发行的版本行为。那我们还有两个叫Client和Server的东西,是Unreal本身提供了一个解决方案,我们主要是用CS结构的,那Server这个地方其实也是Unreal生成的,但Server的话,它通常不在引擎界面。那这样的话,就是我们为client,纯client和纯server做的两个各自的东西。这是为有一些需要用到这地方的客户,比如说做网游啊,或者说是做一些类似于这样的网络游戏吧,或者网络产品,一般来说,最终产品我们都会选用<empty>。
这里是说,刚才说了那么多关于项目的设置,其实这里是说,一些选项,哪些可用,哪些不可用。像大家可以看到,如果只做项目的话,像Client和Server就是不可用的你只能编Editor和<empty>。但是如果说是,连带着引擎,这部分其实是,不光是我说的,二进制,获取引擎的源码版本是这个样子的,如果说是直接从launcher下载一个二进制的可执行的引擎版本,那么你仍然可以用那个引擎版本去创建一个带有源代码的功能的项目。在那样的项目中是可以做这张表上所列出来这几个。对于完整的引擎源码版本的话,就是有更多选项可以使用,所以大家可以根据自己的项目要求来做。
那这个launcher其实和Steam是类似的一个东西。你可以通过这个launcher来进一步地下载引擎,并且去使用这个引擎。那这个launcher上面其实除了Unreal以外,大家还可以看到一些其他的tag链,其他的一些tag链其实就是EpicGames发行的一些游戏,或者说第三方发行的一些游戏,那最终这个东西是希望能够,让不只是开发者,也包括Unreal的游戏代码者能够使用这个程序。那在这个launcher上,它分了,在左侧分了好几个部分,最下面那个部分,工作的部分,其实就是放置虚幻引擎的版本和虚幻引擎项目,就大家自己开发了一个项目的。学习和虚幻商城它里面放置的是很多在网上或免费或收费的资源,那对于,像我自己是程序员,对于很多程序员来说,我不会做动画,我不会做模型,我不会画贴图,那么我可以在学习和商城里面去找有其他人放出来的一些模型贴图,来拼一个我自己的游戏,当然也可以去找美术来帮你一起做类似的东西。那第一个社区其实就是一个入口,那大家可以,我们有论坛,可以为大家在使用Unreal过程中去解决一些问题。
在launcher之后,就是使用编辑器打开的第一个项目。那在这个编辑器上,我们本身默认提供了各种各样不同类型的项目的模板,如果说你们要,通常VR是第一人称的,就可以选择第一人称的模板,当然也可以选择第三人称或者说是顶视角的模板,其实也有一些VR游戏是使用顶视角的,做的也非常好。比如说Oculus上有一个叫做《Fairy Land》的一个游戏,一个小松鼠,它是一个顶视角的VR游戏体验。
那Launcher本身,会不管你是launcher的项目,还是你自己用源码编译出来的项目,它这里其实都是会在硬盘上去搜索所有的项目文件,并把项目文件列出来。那这里要注意的是,不同的项目可能对应的引擎版本号不一样。这里刚刚开着电脑,有一些项目如果是灰色的话,就说明不是当前这个编辑器的版本号,所以你需要关注一下当前的版本号是什么。一般我们建议就是,如果说是开发一个完整项目的话,并且这个项目比较长,最好是选一个固定的引擎版本,并且不要变。那如果说是基于自己学习,或者做一些研究性质的,可以随着引擎的版本更新,不断地去追最新的引擎版本,来获得最好的引擎功能。
插件界面其实就是所有的VR插件,VR硬件的各个插件的选项,你如果说只需要为某一些硬件做的话呢,并不需要都勾上,只要勾某一个,或两个就可以了。

Unreal做VR内容和非VR内容有什么区别

这里第一步就是需要去搭所有的硬件,比如说你拿到Oculus的话,Oculus整套硬件的设置其实还是挺复杂的,它需要就是,你要定义它是坐着的,还是站着的,你要定义这个范围大概是多少,你要定义你是在用手柄还是用Touch。当然Vive也是一样,Vive其实有,Vive有三种定义,Vive叫roomscale,可以在一个房间走动,你也可以站着玩,你也可以坐着玩,对应这三种不同的设置,Vive或者Oculus它们都在整个setup的过程提供了很明确的选择。那这个装好以后你就要保证你的硬件是可用的,不然引擎跑起来以后,也不知道是引擎的问题,还是硬件的问题。所以这里一定要,我见过太多用户,说用引擎跑VR跑不起来,然后结果就是,硬件设置的,没有设对。然后就是,我们新建VR项目的时候可以看到,其实引擎在新建项目的时候提供了很多不同的选项。
那在这里我们想说的是,用VR的话,第一个要选择移动平台,第二个要选,就是右边这个,可缩放的一个状态。最后的一个选项是要把新手内容给去掉。那么为什么要这样说呢?因为,第一个,如果你是用了游戏机模式的话,整个引擎会做一个比较高质量的画面的设置,那在这个设置下呢,VR的帧数就不够,包括第二个也是,同样的原因。那第三个是,引擎我们提到的一套,我们叫新手用户的内容包,那这个内容包里面包含了很多很多模型啊,材质啊,各种东西,那对于VR的话,一个是用不到,还一个是这些的存在会使得最终打包的游戏比较大。所以说,我们推荐用VR项目的话,做这样的一个设置来开始制作游戏。
网上有我们收藏的一个配置文件,在这里面,它对VR的各个参数做了很精确的调整,我们一般建议大家可以下载设置以后,然后把这个可以重新拷贝到你们自己的项目里面,让这些选项可以生效。那这些选项里面我随便挑两个,主要是,比如说第二个screenpercentage,它其实是一个,对于制作VR来说,通常会把画面做到130%,然后完成畸变后,这个画面会比较精细,那当自己的,发现帧数不够的时候,甚至可以把这个值调的更小一点。这个值越小,就会使得视野范围越小,VR的沉浸感就变差了。然后就是,我刚刚说到Unreal有一个叫做Instanced Stereo Rendering的功能,这些东西一定要记得,可以开一下,如果是做PC VR的话,把这个东西打开,会使得性能提高非常多。移动VR的话,目前还不支持这个功能。Instanced Stereo Rendering的代码,那传统的VR绘制是左侧的这个,基本上就是先把左眼画一遍,再把右眼画一遍,那Instanced Stereo Rendering其实就是针对于某一个模型它左右眼同时画,这样的话会使得最终这个渲染速度提高的非常多,但是具体多少也取决于场景的模型量和一些具体的一些美术数据,但这里面我们是推荐打开的。还有就是,做VR项目的时候,应该关注一下我们叫做后处理的性能,对于引擎来说,我们引擎会提供一个默认的后处理,在后处理中会加上很多效果,比如说我们有一个效果,就是有一点像大家在隧道里,开出隧道以外,忽然变亮了以后,那个亮度的颜色重新去调整一下。那这样一些东西其实对VR的项目来说,都是会产生额外的性能消耗。那么我们一般建议就是,大家可以在场景中放一个后处理的volume,然后把这个volume的unbound给勾上,这个地方可以看得出吗?就上面这个图,unbound勾上以后,这个volume就是全新的volume,然后把这个volume上所有的后处理项目都关掉,或者至少把几个性能开销比较大的后处理关掉。VR的性能优化,其实是,其实更多地是关注在绘制的素材本身,而后处理呢,后处理的性能其实都是体现在一个画面,就是画面显示屏上,最终产生一个方的画面,都是在这个方的画面上做的一些处理,所以说,其实后处理的很多效果对VR都未必起效,所以做VR内容的话应该要关注到这一点。不要用太多的后处理,实际上有些后处理画出来在VR中看也会很假。
然后,就是世界场景比例,那这个比例,通常来说我们做游戏都喜欢把这个比例做的小一点,就人显得大一点。感觉在游戏中能跑的很快。那对于VR来说,大家应该关注的就是,我们应该做的尽量真实,只有真实的话,VR用户体验才是最沉浸的,不然的话,画得很大的话,其实VR中一看就会看的非常假。这里提到的是,一般我们叫做motion sickness,这部分其实做VR的人应该都了解,比如说要保证足够的帧数,因为一旦帧数比较低的话,在做VR内容就很容易晕,尤其是,比如说现在的设备,比如它是跑90帧的,如果你一旦不到90帧,哪怕是89帧的话,在最终设备上体验可能就只有45帧,所以一定要一直保持在90帧以上,或者至少保持在设备的目标帧数以上,然后还有就是,开发人员千万不要自己去测试,因为开发员测试,绝对是不晕的,怎么做都是不晕的,就像程序员都说,我的代码没有bug一样。然后就是,关于脱离玩家的摄像机移动,其实传统来说,就是最好是不要移动,要移动的话,一定要非常非常的慢,还有一个就是,最好是往前移动,不要去左右移动,或者上下移动,我们自己测试最晕的一个场景就是,把玩家放置在一个那个,一个电梯,就是像楼梯那样的电梯上,然后两边是很窄的,那个非常非常晕,还有一点是,最终VR的一个FOV的数据,就是在游戏中画FOV,就是FOV通常会有视场角,就是视线的角度需要跟硬件设备去匹配起来如果说,这个不匹配的话,看着会非常的怪。这个就是刚才说的不同设备有不同帧数,因为这个表我们从DK1时代就一直在跟,所以就从DK1一直到现在。那基本上现在最清的设备都是跑在90帧,那PSVR的话,它硬件的标称有120帧,其实大部分游戏是跑不到的。但PSVR它自己在硬件上做的一个帧率差值,所以还好。但对于Vive和Oculus的话,建议大家一定要做到90帧,不然的话就会被降到45帧。这里也是一个为了真实,就是传统的做法,我们会把camera设置的很高,这样的话,显得在游戏中角色很高大,然后大家打起来会比较开心。但是实际上VR的话,就要去匹配玩家一个真正的高度,才能达到一个比较好的真实感。然后到这里右边大家可以看到,在这个角色背后有两个camera,这其实也是,并不是放错了,其实一个camera是VR camera,一个camera是第三人称camera,因为玩家玩别的游戏的时候,如果说这个VR游戏做的好一点的话,在玩的时候甚至可以把头盔拿下来,拿下来的话,可以在电脑上看到这个游戏,运行的状态,那电脑上的画面显然不能用头盔的位置来决定,所以其实我们这里提供了两个不同的camera。
Unreal蓝图是一个很重要的概念,那么在蓝图中,我们也为VR硬件做了很多很多独特的函数,包括当前VR头显是不是处于一定的状态啊,还有一些接口,比如Steam VR的接口,因为Steam VR有两个手柄,所以会多出一些接口,而很多VR它可能还没有手柄,那对于不同VR硬件,我们这里应该都会去提供不同的一个蓝图的接口来做,来让大家发挥硬件最大的性能。
粒子特效和透明材质,那对于粒子特效是一个营造游戏体验的一个非常好的东西,你想你在头显中,一个爆炸在你的左边或右边,炸了以后,效果还是非常真实的,但是,通常美术在做粒子特效的时候会使用很多很多透明材质来得到一个非常好的效果,不管是光,还是爆炸,还是烟雾。那么其实透明材质是非常非常费的,它会有一个非常大的渲染开销,甚至在VR中,甚至要把画面画两遍,它的渲染开销就更大了。那Unreal提供了一个叫做DitherTemporalAA的材质结点,这个材质结点可以把透明材质变成一个比较cheap的一个解决方案,那这个结点它大概的做法就是,把所有透明材质,拿到以后,把前景和后景,就是把透明材质上一个一个一个的像素点单独拿出来。它只是把这个像素拿出来,50%的像素用前景颜色,50%的像素用后景颜色,它本质是不透明的,但它最终效果可以达到一个接近于透明材质的状态,那这也是,就是可以用到的一个小技巧。这里想说的是面向,因为VR你必须向性能妥协来达到最好的帧数,那么我们还是需要有很多真实感的营造,比如说人的一个地面的反射,当一个人走在一个水面上,或者云面上的话,他需要,你只有,这个人如果你不去画他的阴影的话,这个人会很假,一看就是在空中的。但如果你画了阴影的话,这个人就感觉是踩在地上的。那阴影又怎么画呢?你如果反射的话,这里就开销非常大,那这里我们就可以,一个方法就是,你可以用,底下画一个圆的,一个假的圆片,让这个地方产生一个阴影的效果,同时它又没有太影响帧数。那么像这样的一些就是tricky的方式其实有很多,大家也可以自己去发现,可以和很多社区里去交流。
最后,关于VR和非VR,在Unreal中有很多人喜欢用SSR,就是屏幕空间反射。那这个屏幕空间反射还是一个面向整个画面的一个处理,那这整个画面一旦到了VR中,左右眼,效果又起不到了,所以我们这里不建议用屏幕空间反射而是用传统的环境反射的方式,包括法线贴图,normal map在单窗口的渲染效果很好,但是到VR中,尤其是用户眼睛近的时候,normal map其实不起效的,一看就看出来这个东西不是立体的。那么我们推荐了另外两个方式,那这个方式原理我也就不解释了吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ