Unity应用《暗影格斗3》中的渲染优化!
Posted 哲想动画
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity应用《暗影格斗3》中的渲染优化!相关的知识,希望对你有一定的参考价值。
前言:在本文, Banzai Games的首席技术美术Roman Tersky将介绍《暗影格斗3》上角色装备的渲染过程,使用材质和设置环境的一些技巧。
《暗影格斗3》是一款使用Unity开发的RPG动作游戏,该游戏于2017年11月发布于ios平台和android平台,至今游戏的安装量已经超过5000万次。
为了吸引如此庞大的玩家群体,开发团队在游戏优化方面必须表现出色。在开发团队的努力下,《暗影格斗3》在多数设备上可以以60fps速度运行。
玩家经常称赞《暗影格斗3》的视觉效果,本文将分享游戏开发团队的制作心得,介绍如何实现这种视觉质量。
渲染游戏帧
有很多因素会直接影响游戏的性能和帧数,最重要的因素之一是游戏中每帧使用的Draw Calls。在为每个使用相同材质的静态对象组渲染游戏帧时,Unity会使用Draw Calls,并使对象互相覆盖。
每次Draw Calls都需要使用CPU资源,因此优化的重要步骤是减少Draw Calls的次数。我们的目标是最小化调用次数,把每帧的平均调用次数减少到100。
每帧画面的渲染过程
《暗影格斗3》渲染的第一步是绘制角色的动态阴影和角色的盔甲与武器上光亮元素的发光效果,这二个过程有各自的特点。
阴影
除了用于主要帧的主摄像机,我们还在场景放置了一个额外的正交摄像机投影器,用于把阴影从角色绘制到我们称之为“ShadowReceiver”的单独平面上。该投影器会跟踪游戏对手之间的中点,并根据他们的当前位置在平面创建投影。
处理结果采用Alpha纹理形式,它会把相同纹理替换为“ShadowReceiver”对象动态材质上前一帧的渲染结果。这种方法有助于我们避免计算真实的阴影并对场景中所有模型绘制阴影,从而对整体性能产生了显著影响。
ShadowReceiver平面
这一帧的渲染过程使用了20次渲染调用。
发光效果
角色盔甲和武器上创建发光效果的过程类似制作动态阴影的过程。
“BlurCube”对象会在带有发光元素的模型周围创建,发光效果每帧都会向该对象投影,投影效果基于发光对象材质上RGB纹理蓝色通道内的信息,这意味着蓝色通道在投影发光效果时会用作“遮罩”。
应用模糊效果,将这些信息保存为Alpha纹理,然后把该纹理替换为动态“BlurCube”材质在前一帧的结果。
BlurCube
在这一帧中,发光过程计算使用了15次Draw Calls,以及额外的2次调用来模糊效果。
网格绘制
首先,我们会渲染盔甲和武器的部分。然后渲染前景位置的所有部分,接下来是背景对象,而后是背景本身,背景是一个纹理大小为1024x512的平面。
此后会渲染粒子系统,前景的部分小细节,最后渲染使用顶点动画的模型。在后面的2次Draw Calls中,我们会应用已计算并绘制好的阴影和发光效果。
网格绘制
除了上面提到的摄像机,我们在渲染过程还使用了另一个摄像机,用于渲染用户界面。和摄像机及正交摄像机投影器不同,它不特别用于每个场景,它会在游戏运行期间一直存在。
因此,在渲染场景,角色和视觉效果后,我们会渲染UI,并把它放在主要帧画面之上,伴随着屏幕边缘附近的黑色晕影。
主摄像机渲染
UI摄像机渲染
最终帧渲染
总体而言,场景最终帧的渲染需要92次Draw Calls。
角色装备的材质
为了创建角色盔甲的材质,我们使用了分辨率为512x512的纹理,包括:漫反射贴图、RGB遮罩、MatCap纹理、用于暗影形态的漫反射贴图,以及小型噪声纹理,MorphMask会使用噪声纹理来制作角色外观过渡为暗影形态的效果。
漫反射贴图其实是盔甲本身的纹理。
RGB遮罩纹理
由于RGB纹理通常由每个像素由值0或1定义的三个颜色通道组成,因此使用RGB纹理会方便保存对象UV图特定位置上材质的各种数据。
在我们的游戏中,RGB纹理通道(遮罩)包含以下过程的信息:
红色通道表示,如果对手角色穿着和自己相同的盔甲,材质的哪些元素会改变颜色。我们使用该系统来避免玩家混淆自己的角色和对手。红色通道设置的盔甲特定部分会重新绘制为美术设计的替代颜色。
绿色通道表示,MatCap纹理应用于盔甲的哪些元素。MatCap纹理会创建金属表面效果,该效果的大小保存在绿色通道,纹理越亮,金属光泽越强。
蓝色通道表示,哪些部分会使用发光效果来模拟发光表面。
Matcap
为了制作盔甲和武器上金属元素的反射效果,需要为每个地点使用分辨率为512x512的特别MatCap纹理,该过程基于各地点已处理的截图,截图带有其结构和光照的所有特性。
根据战斗地点,我们在角色的盔甲和武器材质上使用了相应的MatCap纹理。金属表面的这种效果应用于材质的特定部分,根据RGB遮罩纹理绿色通道中的信息而定。
这种方法性能消耗低且易于处理,实现了带有反射的逼真金属表面效果,同时具有角色所处竞技场的所有细节。
暗影形态
当角色进入暗影形态时,材质的漫反射纹理会替换为专用于暗影形态的纹理。
为了平滑地过渡纹理替换过程,我们使用Morph噪声遮罩来实现过渡效果。
战斗地点的光照
战斗地点的所有光照和阴影都烘焙到光照贴图纹理中,分辨率为2048x2048,这样消除了实时计算光照的需要,并且大幅提高了性能。
唯一的定向光源用于照亮角色,使角色光照符合发生战斗的竞技场总体环境。然而,使用这种方法时,角色的光照效果在场所的任何位置都会相同,无论他们是站在树冠的影子中,还是直接暴露在阳光下。
这个问题可以通过计算环境对象的动态阴影,并把阴影投射到角色模型上来解决。但这样做会损耗游戏性能。
作为替代方案,我们为每个地点使用了单独的特别梯度阴影贴图。该贴图实际上是分辨率为1024x1的纹理,它是基于地点截图制作的光照梯度,保存了背景各部分的阴影数值。
阴影贴图
当角色在竞技场移动时,在应用定向光照后,盔甲的颜色会乘以角色在地点中所处位置的相应梯度颜色。因此在阴影位置中,所应用的光照显得比开放区域的更暗。
应用了阴影梯度
梯度显示在该位置没有阴影
在最后的修饰中,我们使用了边缘光照技术来突出角色模型的边缘,使角色边缘可以被清楚地看到,例如:在燃烧村庄的地点。该技术允许我们为角色添加轮廓,使角色能够从竞技场的背景中脱颖而出。
动态竞技场效果
给《暗影格斗3》战斗地点“添加活力”的重要部分是使用FX效果和动态对象,例如:旗帜、树上的移动叶子,草地等。
特效
《暗影格斗3》中多数特效,例如:火焰、下雨、阳光等,都是基于把动态材质应用于静态的低多边形模型的原理,但也有部分效果由粒子系统制作。
动态对象
在所有《暗影格斗3》地点中,共有二种类型的动态对象:
•一种是物理对象。通过模拟物品结构,并对这类对象施加风的吹动效果来实现。
•一种是带有顶点动画的3D模型。对于带有顶点动画的对象,我们会制作循环动画轨道,设置动态的3D模型顶点。
开发思考
《暗影格斗3》的地点很像戏剧场景。就像剧院的观众一样,游戏摄像机只在一个方向选择,不会过多改变角度。
环境物品也根据戏剧布景的原则来设置,只使用玩家可以看到的物品。场景边缘和摄像机下方什么都没有,所有模型仅在可以进入摄像机视野的位置才有几何形状。
对地点的思考
为了解决带有反射表面,例如:大理石地板、水面等,在竞技场中反射效果消耗大量性能的问题,我们复制了会被反射的元素,把它们沿Z轴的大小设为负数。
副本位置使用了特别方法和本体对齐,使本体和副本看起来就像是各自的反射。反射表面的材质拥有透明度,大小取决于表面的性质。这种方法不仅提高了游戏的性能,还提供了非常逼真的结果。
结语
为移动设备进行渲染优化非常重要,本文内容是专门针对《暗影格斗3》的解决方案。
公司名称:北京哲想软件有限公司
北京哲想动画官方网站:www.cogito.com.cn
北京哲想动画微信公众平台账号:zhexiangdonghua
北京哲想动画影视技术交流群:374715513
北京哲想动画邮箱:sales@cogitosoft.com
销售(俞先生)联系方式:+86(010)68421378
微信:18610247936 QQ:368531638
以上是关于Unity应用《暗影格斗3》中的渲染优化!的主要内容,如果未能解决你的问题,请参考以下文章
Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术