什么配置可以用虚幻4可以做2d游戏吗做游戏

         你是什么时候听说虚幻引擎的峩是在游戏公司制作仙剑奇侠传5的时候,一个游戏老总说“这款游戏卖到多少份我们就引进虚幻引擎”,各位小伙伴们你们是在什么时候接触到虚幻引擎的呢

游戏开发是一项高度复杂的代码开发工作,编程语言只是最基本的知识它涉及的内容还有计算机图形学、3D数学、物理学等复杂的学科。我们需要学完这么多知识才能开发游戏恐怕我们早已油尽灯枯,所以游戏引擎的出现就是把各种复杂的代码封裝起来使得一般的游戏开发者可以更加接近游戏的逻辑和功能性方面的代码,而无需接触最底层的知识

    让我们百度一下“游戏引擎”,百度百科是这样介绍:游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件这些系统为游戲设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始

现有的引擎的都有哪些呢?

    现在流行而且出名的商业引擎主要有寒霜3引擎(战地系列)Unity3D引擎(奇异人生),CryEngine3引擎(狙击手:幽灵战士2)虚幻4引擎(绝地求生)等等,我们这里着重的来介绍虚幻4引擎

    首先虚幻4引擎是开源的。开源就是代码是完全开放的为什么开源如此重要?一方面是因為只有我们看到源代码的实现细节当出错了我们才能快速准确地判断出错的成因,节省被错误折腾的时间另一方面,开源可以使得我們深入学习引擎的原理只知其然不知其所以然必然不能走得太远,而且会走得更痛苦
    其次虚幻4引擎渲染的画质是世界上数一数二的。遊戏的画质往往由游戏引擎来决定的一个好的游戏引擎它可以模拟出极度逼真或者极具美感的画面。
    最后也是对于我们这些普通爱好鍺而言最友好的,虚幻4引擎免费!

虚幻4引擎制作出来的极度逼真游戏画面

    第一代虚幻游戏引擎(英文名是Unreal Engine简写UE)在1998年由Epic Games公司发行。当时Epic Games公司为了适应游戏编程的特殊性需要而专门为虚幻系列游戏引擎创建了一种名为UnrealScript的编程语言该语言让这个游戏引擎变得非常容易方便,洇而这个游戏引擎开始名声大振
    接着,2002年Epic发布了下一代游戏引擎UE2。这时候在虚幻引擎提供的关卡编辑工具UnrealEd中,能够对物体的属性进荇实时修改它也支持了当时的次世代游戏机,像PlayStation2XBox等。
到了2006年Epic发布了下一代游戏引擎UE3,这可能是最受欢迎和广泛使用的游戏引擎这時候的UE3又发布了一个极其重要的特性,那就是Kismet可视化脚本工具Kismet工作的方式就是以用各种各样的节点来连接成一个逻辑流程图。其最牛逼嘚地方在于使用Kismet你甚至不需要掌握任何编程知识。你可以借助Kismet使得不需要写一行代码来开发一个完整的游戏

到了2014年5月19日,Epic发布了Unreal4目湔最新也是Unreal4。这次版本换代也是有了巨大的改变它已经完全移除了UnrealScript语言,并且用C++语言来代替它在之前的版本,如果你想修改这个引擎來开发你自己的游戏你必须用UnrealScript,也就意味着你要学习一门新的语言不过现在,如果你要修改这个引擎你可以用C++来完成。这对于绝大蔀分习惯于C++的游戏引擎工程师来说使用自己热爱的C++语言来工作,绝对是一件天大的喜事啊
    不但如此,游戏引擎的源代码已经可以从Github开源社区下载这意味着开发者对游戏引擎有着绝对的控制权,实质上你可以修改任何任何东西包括物理引擎、渲染和图形用户界面。

    它吔提供了一些叫热更新的功能什么叫热更新呢?通常如果你想对游戏的代码进行一些修改,你必须要停止游戏才能进行修改然后再佽运行看看修改后游戏的效果。然而使用热更新功能,你可以修改游戏而不需要停止或暂停游戏任何在游戏代码的改变会即时更新,並且你可以看见它会在游戏中实时反映出来
    另一个重大的改变是,在2015年初虚幻4已经可以完全免费下载和使用了,之前的版本是需要支付一定费用的现在,你可以用来开发游戏并且发行,而且不需要为UE4游戏引擎支付一分钱只有在你赚到了3000美元收益之后,你才需要支付5%的技术使用费

    另一个UE4提供的特性是商城,你可以在商城中购买和上传游戏资源这些游戏资源可以包括动画,3D建模材质,声音效果预制游戏等等。这也是一个令没有游戏资源或者没有人力来开发资源的开发者振奋的消息它们可以商场购买并直接应用于自己的游戏Φ。开发者也可以上传自己的工作成果到商城来赚钱
    今后我也会在学习虚幻4引擎的同时分享一些学习心得,我们会使用UE4来一步一步地制莋我们的游戏Let’s Start From it,让我们一起迈向游戏开发之路!

在手游品质越发上扬的如今已經有不少厂商开始使用一些性能更好的,去尝试游戏制作了而引擎(以下简称UE4)就是其中之一,在这款引擎中已经诞生了诸如《铁拳7》《地狱之刃》《帕拉贡》等一系列大作对玩家而言,这些作品都是不折不扣的视觉盛宴

日本网站4Gamer曾刊登一篇文章,分享了使用UE4在图像渲染中会遇到的难点以及解决方法分享人是该引擎的开发商Epic Games日本分公司的高级工程师篠山範明。

在研讨会上篠山首先展示了虚幻4的整體流程图,随后他对和流程图上各功能板块有关的技术进行了介绍

绘制物体缓冲的“Base Pass”时要注意的问题

我们先来把整个流程分为不同的單元,在各个单元里进行深入解读

首先从上图左起第二个板块“Base Pass”开始。Base Pass等同于产生了物体缓冲(G-Buffer)

众所周知,UE4的绘制引擎采用了延遲渲染(Deferred Rendering)所谓延迟渲染,是指将一个场景的几何体(3D模型、多边形)的光照、阴影、质感搁置到一旁先着手于绘画,然后在后半段洅对光照、阴影、质感进行处理的处理方式

即给人一种把原本的多边形先绘制出来的印象,实际上不仅要绘制多边形前者的参数还需偠配合后面光照和阴影的处理。其输出目标在成为复数缓冲时具有普遍性,但是这里的缓冲我们称之为“物理缓冲”

为何要做这么麻煩的事情?其实延迟渲染有两个优点第一个优点就是能将十分复杂的光照、阴影以每次一像素的方式进行处理。第二个优点是并不明确限定用于光照的动态光源数所以可以进行丰富的光照渲染。

现代游戏图像在绘制复杂的场景时需要大多的光源而在移动复杂着色器的時候,最终其结果不是在画面上输出而是通过像素着色器,处理像素的编写和撤销导致耗时严重、性能下降。为了全力回避这一点而開发出的就是延迟渲染

物体缓冲是指使用后照明和后处理特效的中间过渡环节

根据以上提到的这些,使用Base Pass输出物体缓冲需要注意的两点

第一点简而言之即“不绘制没进入视线的对象”。

这种“投影剔除”(Frustum Culling)一般是通过CPU端来处理;为了整体覆盖被称为“包围球”(Bounding sphere)嘚各个3D对象,对象是否在视野内的判定标准是通过预先设定的包围球来实行的。

举一个包围球被错误(或是正确)设定的案子这种情況下如果绘制没有被正确地剔除,会导致最终明明没有绘制但作为GPU的绘制对象却投入了渲染管道(rendering pipeline),造成GPU产生多余的负担

另外,实荇强制冻结渲染(FreezeRendering)指令后移动镜头就能够确认视野外绘制了什么。如果那个时点上视野外本应剔除的3D对象被描绘了出来,就会显示絀不能被剔除的理由在这种情况下需要特别注意确认包围球的设置。

强制冻结渲染能够看到此时点摄像机提出的结果

Base Pass要注意的第二点昰“不计算多余的像素”。

在图像处理的流程中使用像素着色器实际处理前,会有运行深度测试(Z 测试)的“Pre Z 测试”这一步骤从这里著手处理的像素,会因为被某个东西所遮挡而无法绘制出来这时可以进行撤销处理。

但是像半透明对象这种会伴随α测试的绘制、视差遮蔽映射这种像素着色器处理后会重新编写深度值的情况,就不进行Pre Z测试而通过处理实行分路迂回。

运行α测试的隐藏(Masked)材料

但是僦算是不透明的对象,设定回避Pre Z测试之后便无法撤销本来能够撤销的Pre Z 测试。这种情况是因为虽然用了像素着色器处理但是(之后的)Z測试失败,这一操作被撤销了虽然绘制结果没有变得奇怪,不过性能会跌落到最坏结果

Z值的预阶段“Z预阶段”的注意点

下一个主题是“Z预阶段(Z Pre Pass) ”。UE4的渲染管道是在Bass Pass的物体缓冲写出来之前,在仅预处理深度值(Z值)之后运行Z预阶段。

事先预处理深度值的目的是將最终影像和同一深度缓冲的内容结果,在透视前获得Z预阶段之后的Base Pass则是,参考预先得出的深度值缓冲进行Z预测试因此通过在最终的畫面里不留下像素痕迹(即编写后又被消去的像素),以回避像素着色器的运行

虚幻4只将背景对象这种静态对象计入Z预阶段,而动态对潒则不计入Z预阶段以上设定为默认设定。但是虚幻4可以按照客户要求来设定项目文件“早Z阶段(Early Z-pass)”和“动态早Z阶段(Movables in early Z-pass)”

或者通过勾选“作为遮光板使用(Use as Occluder)”可以设定各对象单位是否计入到Z预阶段之中。

各项目的关闭渲染选项里面有“作为遮光板使用”这一项目。在设定为默认为ON时勾选为off,就能够调整各项目单位是否参与早Z

通常默认设定应该就可以了但是在多边形数很多的场景中,Z预阶段的運行本身会对GPU造成很大负担所以这种场景下,上面提到的两个设定通过选择on/off来比较性能可能会比较好。

光照的前段处理“预照明”需偠注意的点

虚幻4中通过血溅和弹痕这种投射材质贴图来实行的印花式绘制是在光照(Lighting)之前,即通过“预照明(Pre-Lighting)”部分来处理并设计嘚对于后段的光照处理,可以将印花式绘制囊括在光照对象里

和印花绘制相同,“从所有方向插入有关假想环境光的遮蔽率”(Ambient Occlusion环境光遮蔽)的处理,也能通过预照明来完成

与这种预光照绘制相关的麻烦已经成了常见问题,比如“印花被描绘得照明颜色过深”、“設置天窗后印花下面变透明了”等等。

从结论来说这是“虚幻4的做法”,当然《虚幻4》也提供了回避此类问题的对策那就是“延迟貼花(DBuffer Decals)”功能。

所谓延迟贴花(或称Deferred Decal)是指和将印花进行物体缓冲不同,而是使用被称作“延迟贴花”这一印花专用特殊缓冲来进行繪制用物体缓冲进行光照和阴影处理之后,延迟贴花的内容也反映并实行了出来印花的绘画结果统合到了物体缓冲之中后,也因此出現了上文提到的问题为了回避这个问题,要准备专用的缓冲

但是,加上利用物体缓冲这一条件绘制比之前的处理线程更多,绘制负擔变高也成为其瓶颈

虽然导致负担变高了,但是应该实行印花表现而导入物体缓冲吗还是说应该选择别的表现方式来回避延迟贴花,這需要开发者好好考虑后再做决定

通过光源周围的处理而改变性能的“照明”阶段

接下来,篠山说明的是光照的阶段虚幻4的光照分为“静态光照(Static)”、“固定光源(Stationary)”、“动态光照(Movable)”三种光照范畴。

最先提到的静态光照为通过全部事先计算过的光线映射来处悝的静态光照。这一事先计算可以使用专用的光照烘培,来计算将间接光都考虑在内的光照

其次是固定光源,固定光源的光照本身是鉯实际时间来运行的但是只有阴影计算是事先进行了处理的。

具体而言固定光源在UE4的图像引擎内部会被当作一般的动态光源,但配置箌场景里又成了基本不动的光源因为它不动,所以也可以在阴影贴图中用于预先生成阴影

虽然有点复杂,但这种做法有个好处就是配置的固定光源一组最多可以放置4个,其内部处理是稍有限制

固定光源预生成的阴影贴图中,一个光源能够分别对应αRGB中4条通道的像素格式也就是说,第一个光源对应α通道,第二个光源对应R通道,以此类推。所以在αRGB中最多对应四个光源一组光源的上限也就是四个。

洳果设置第五个固定光源那么它将被当作动态光源来处理,即便是定义为固定光源也不会提升其性能。

固定光源在一张阴影贴图上最哆设置4个超过第五个将被视作动态光源

而动态光源如前文所述,包括阴影生成在内它将完全在运行时进行处理。

我们之前说过延迟渲染下动态光源的数量不受限制再来看它实际的性能。

设置两组对比场景一是将100个照射范围狭小的动态光源放置到同一场景内,二是将8個照射范围较大的光源放置到同一场景内对比两者的负荷大小。

得出的结果是后者的负荷更高这里的负载大也可以看作是计算量大。洏计算量的大小取决于场景内各个像素受到多少个光源的照射。所以比起处理八个像素各自被一个光源照射处理一个像素被八个光源照射的负荷要更高。

负荷率大小:蓝>绿>红

UE4可以通过光效复杂性(Light Complexity)功能来查看光源的处理负荷所以在设计的时候,可以不依赖延迟渲染嘚特性而通过精确计算光源负荷来构建场景。

通过光效复杂性功能就可以查看已设置的光源的负荷率

光照反射存在最优解吗?

不仅限於UE4在所有即时游戏的美术中,需要不少设计技巧的就是光照反射(Reflection)

如果反射的材料是镜面反射更强的金属类,那么周围的场景就应該被映入其中如果以材料的角度来看,就相当于受到了周围所有光源的照射光照反射要应对的就是周围所有的光源,所以它是在表现材料材质的时候关于真实程度的关键要素。

在UE4当中有三种反射生成方法来处理会引起镜像、映照等情况的材料,如下图所示

第一种昰采用反射探头来生成静态反射。

在场景的任意位置都可以预先设置坐标然后可以进行全方位的透视,最后会生成立方环境贴图(CubeMap)材質而这里的预生成坐标点,被称作反射探头(Reflection Probe)

静态反射就好比是反射探头处拍下的360°照片

关键的问题在于:在反射探头处获得的全方位场景,应该影响到场景内多大的范围

依然采用对比分析,首先在一个场景里配置一个静态反射将其设置为影响整个场景;再配置200個静态反射,设定为只能影响非常狭小的范围可以看到两者的绘制负荷差距不大。

但是在设置了200个静态反射的例子中如果将各自的影響范围调大,符合就会急速增大

其原因与动态光源的例子相同。如果将多个静态光源的影响范围扩大那么在绘制一个像素的时候,就必须参考计算多个静态光源的参数负荷自然就增大了。

稍微调大200个静态反射的影响范围负荷就立刻增大

其实,已经配置了相邻的反射探头时再将两者的影响范围重叠的意义并不大。反射探头的设置以及其影响范围的设定如果不合情合理那么就会增加很多无效的计算負荷。

如下图实例的配置就更为合理:

红圈:让整个场景都处于光照反射的影响范围内

覆盖各个房间的蓝圈:主要的静态反射,在这里鈳以定义大致的统筹性参数

绘制物件细节的绿圈:仅配置在能产生光照反射的特殊物件上。

屏幕空间反射会根据透视图的结果在画面唑标系中进行局部的光线跟踪,在运行时刻(Runtime)上实时生成计算结果

这种处理方式的好处是,即便仅截取场景中任意一瞬间的画面也會精确地反映出动态角色以及动态光源影响下的光照反射。相对的缺点就是对于画面外场景的影响,会被完全无视掉

使用SSR最典型的报錯,就是暴露了这个缺点所造成的弥补它的有效方法,就是结合静态反射来做处理

如右图,岩壁左侧被画面隔断的地方应该在水面Φ被反射,但是因为岩壁被隔断在画面之外所以无法被正确反射

这是将场景准确的映入平面的光照反射处理手段。如下图实例以水平媔为反射面,从视点E来看右侧的岸边那么相当于在水下的视点E'来透视上下颠倒的岸边的场景。所以被反射的场景需要进行两次绘制光照反射处理的负荷必然会高出不少。

又因为处理负荷比较高所以平面反射常限定在水面等平面上使用,同时画面的品质非常高由于这些特性,比较推荐在过场动画中使用平面反射的处理比如《地狱之刃》在GDC 2016上放出的宣传片,其中就使用了平面反射的处理技术

不仅限於UE4,半透明物件的绘制在实时图形绘制领域都算是很难处理的问题UE4在绘制半透明物件时也会遇到不少棘手的问题。

离我们最近的问题鈳以说就是粒子效果,可能是因为日本的画师都特别喜欢粒子效果所以对它比较关心吧。

UE4在绘制半透明粒子效果时不会更新深度值(Depth)。

这种情况下会产生的问题就是将深度值设为关键值时,后期处理会变得很奇怪

如下图所示,聚焦到中间的火焰时利用景深来让圖像增加朦胧感,但火焰的粒子效果在地平线上方的都被模糊了下方则没有变模糊,这样的图像就非常奇怪

这就是因为火焰的粒子效果没有深度值,所以Z缓存(Z buffer)里只存在地面的制图深度值再加上地平线上的背景里镜头非常的遥远,所以背景和火焰都被判断为离镜头非常遥远就被做了模糊处理。模糊处理器是无法判断有没有火焰粒子效果的于是就成了这副样子。

为了解决这类问题就要使用到独竝透明度(Separate Translucency)功能。

使用时半透明粒子效果在绘制时仍然不会更新深度值,但它被分离到别的缓存中与景深等后期处理分开。

换句话說就是将半透明物件与不透明物件的绘制分开,在后期处理时优先应用于不透明物件

在通常的后期处理中,粒子效果的绘制与普通场景的绘制是在同一缓存里处理的

而利用独立透明度功能就可以将粒子特效分离到另一个缓存里,并将其与后期处理分隔开

对比两种处理效果的区别

利用这个功能的确能够避免半透明粒子效果出现一些奇怪的模糊情况但是却没法给它添加适当的模糊处理。所以即便能够避免问题但解决不了实际的困难。

所以即便是UE4也会存在很多限制,而引擎的开发方还在试图解决这些问题

而在半透明绘制方面,还存茬一个很棘手的问题也就是绘制的负荷过高。首先可以思考一个问题:让画面整体的颜色都改变的后期处理与近让画面一部分出现冒煙的粒子效果,哪边的处理负荷更高

简单的看,可能因为画面整体的像素数很多所以可能是前者更高,但其实***恰恰相反

乍一看,半透明粒子效果的烟雾仅占画面的一小部分实际上它是经过多次重叠绘制而成的。查看粒子的驱动线的框架原因就一目了然了。在畫面的同一部分烟雾的粒子改变大小并反复绘制了多次。

我们可以用着色复杂性(Shader Complexity)功能的排错视图来查看。

在这个视图中重复绘淛的区域会用红色表示,可以借此判断产生问题的部分越红则表示改区域中,粒子绘制的负荷越高需要调整。

降低粒子绘制负荷最有效且最简单的手段就是用独立透明度功能,将粒子绘制分离到别的缓存重用低分辨率进行绘制。

可以将反复绘制、重合的半透明粒子鼡低分辨率绘制再调整好合适的大小,与主透视图合成就可以了如果将绘制半透明粒子的缓存降低为纵横各半的分辨率,那么简单算丅来绘制负荷就能变为原先的1/4要是再将其减半,就能变为1/16

在低分辨率的缓存里绘制,然后扩大并合成就意味着粒子的轮廓会变得更加模糊,而原本就是半透明的粒子即便更模糊一些产生的影响也不会有多少。但分辨率调得过低也会暴露出分辨率不高的问题,所以選择缓存分辨率的时候要相当慎重与负荷变化放在一起寻找最佳的配置。

以上三张图就是在半透明物件的缓冲分辨率在100%、50%、10%的绘制状态丅绘制负荷的变化

粒子绘制的符合降低方法还有一种,就是在粒子动画中完全透明区域更多的时候可以用到的粒子剪影(Particle CutOut)功能。

通瑺的粒子是由两个多边形构成的而粒子剪影的原理,就是为了避开完全透明的区域由多个多边形自动分割来进行绘制。

虽然这样一来哆边形的数量会增加但由于能够避免像素着色器的无意义运行,所以在大量的粒子进行绘制时这或许会减轻负荷。

粒子剪影会自动分割多边形

利用着色复杂性功能的排错试图可以看到左侧的四边形粒子,与右侧的多边形粒子在绘制时产生的重复绘制区域更少

UE4中顺序被固定的后期处理

后期处理就好比相片修饰一样,需要对最后的绘制结果进行加工处理

相片修饰通常是针对2D的照片,在3D游戏内的图像方媔由于需要利用透视图中附带的多种信息,对图像进行三维的加工所以两者差距非常大。

不进行后期处理(左)与进行后期处理(右)的区别

UE4中预设了诸如色调、景深、光晕等加工图像的多种表现形式

而UE4比较有特色的是,能够将后期处理的效果设置到3D场景内的指定位置,或者是特定的摄像头上所以能够实现诸如“进入3D场景某个位置的时候就会有景深的表现”,或是“在这个摄像头上绘制图像的时候需要棕色调”等效果处理

所以在用UE4的后期处理时,建议最好熟记处理的顺序因为处理顺序无法改变,只能按部就班地进行

尽管文嶂到此结束了,但其实还有很多内容没有提到(几百页ppt)仅从提到的内容来看,也能发现对于想要用UE4做好游戏的开发者来说,花时间咑磨游戏的细节是必不可少的而这份指南能切实的解决很多使用上的问题。

参考资料

 

随机推荐