前《永恒之塔》技术总监谈如何使用Unity实现次世代效果

文/ 梁子 2015-09-19 12:21:34

我想谈谈关于次世代游戏的话题。首先,我们想为用户提供高品质的游戏体验,目前手机主流的3D画面是这样的。

3-1.jpg

虽然比以前的画面有很大进步,但还可以做的更好看,比如这样的:

3-2.jpg

如果是身穿铠甲的战士,他应该是这样的:

3-3.jpg

或者这样的皮革感觉:

3-4.jpg

所以,我们选择做高品质的次世代游戏。

开发次世代游戏会有2个主要的选择,Unreal 和Unity。所以,我们遇到的第一个问题就是,应该选择什么引擎?

先来看画质对比:

3-5.jpg

这是一个UE4 Infiltrator Demo的截图,品质很高:

3-6.jpg

但PC GPU 性能是要远超Mobile GPU,所以这个demo只能运行在PC 的GPU上,而无法在Mobile设备上运行。那么UE4在移动设备上是什么样的情况呢?以两款三星手机中的画质来对比:

3-7.jpg

3-8.jpg

可以看到UE4,在高中低端手机上,实现的效果差距很大,那么Unity的情况呢?是这样的:

3-9.jpg

可以看到,虽然有一定差距,但是不那么明显。在苹果家族,iPhone5 以下都只支持OpenGl ES 2.0,也就是低端手机。

3-10.jpg

经过详细测试,我们发现:

3-11.jpg

Unreal4在高端设备上表现优越,而中低端设备画质下降非常严重:

3-12.jpg

Unity 在高端设备上没有Unreal4表现出色,但是在中低端设备上画质上较为不错,远超Unreal4的表现。

除了画质之外,在具体开发效率上,Unreal4也不如Unity

3-13.jpg

3-14.jpg

总结下:

  1. Unreal4 Mobile还属于开发当中,只支持高端设备

  2. Unity在中国市面上有大量设备可供支持发挥

  3. Unity对程序提供很高的开发灵活度

因此,最终选择了Unity引擎来制作次世代游戏。

在确认使用Unity引擎之后,为保证高品质,制定了四个目标:

  1. 不想修改Untiy源代码 (修改源代码会造成很多不可预测的BUG)

  2. 保持高效率开发 (主要是C++性能和C#效率的综合使用对比)

  3. 在Unity实现原本无法实现的高品质画质 (重点)

  4. 开发美术方便使用的材质系统,且兼容中低端设备(重点)

【在Unity实现原本无法实现的高品质画质】

“在没有源代码的情况下,Unity可以改善到什么程度的画质? ”这是经常钻研的一个问题

先看一些Unity游戏的例子:

3-15.jpg

《Ori And the blind Forest 》,很好的表现了奇幻氛围 ,虽然是pc游戏,但是如果努力这种程度在手机上还是可以实现:

3-16.jpg

《聚爆Implosion 》,不足之处,安装包超过1.3G。

如果想制作同样水准的次世代品质的作品,安装包又希望只有100-200MB,这是一件很有难度的事情。我是这样解决这个问题的。

3-17.jpg

以这个Unreal4 Mobile中的场景为例,Real HDR(HDR = High Dynamic Range)是如何实现的呢?

先来了解Unreal4的实现机制:

3-18.jpg

如果在中低端设备就会出现这样的情况:

3-19.jpg

所以,中国市场超过90%以上的安卓机型,次世代游戏都会因为信息的缺失而无法显示HDR效果,导致巨大的画质下降,怎么办呢?我们想了一个办法,“用RGBM 形式将曝光的luminance 信息储存在alpha当中”。

3-20.jpg

然后“利用储存在alpha的luminance,以它为基础进行了bloom,使得最终达到HDR效果 ”。

3-21.jpg

这样,在中国市场绝大部分安卓手机也能实现HDR效果,如下图:

3-22.jpg

这样的方案,也会有一些局限性,比如:

  1. 超出的颜色信息会消失

  2. 因为只用Luminance去处理,所以无法实现高饱和的亮颜色(例如强烈高亮的蓝色)

  3. BLOOM效果之外是否可以Tone mapping还是未知 (之后会去尝试)

不过优点更明显:

  1. 绝大部分硬件支持

  2. 因是使用8bit per channel render target,所以消耗很少的fill-rate,不太占资源,游戏运行时候有更好更高的效率 (对于游戏优化很重要)

【开发美术方便使用的材质系统,且兼容中低端设备】

要制作次世代游戏离不开好的材质系统,好的材质系统能实现这样的效果:

3-23.jpg

3-24.jpg

人物的皮肤质感:

3-25.jpg

因为Unity自身没有提供方便美术开发者灵活使用的材质系统 ,所以只有2个选择:

  1. 去Asset Store下载第三方工具(Unity5 开始支持Standard Shader)

  2. 程序制作Shader

第三方工具Shander Forge(U3D商城有售),虽然这个工具:

  1. 以Node based 方式制作Shader

  2. 和Unreal一致的UX (操作界面)

但是最大的问题在于,在中国市场大约30%的苹果设备,和80%的安卓设备都会报错,而不会正常显示。

3-26.jpg

再加上美术缺乏编程常识,一般为了好效果,最后都会构成复杂的node。

3-27.jpg

而不是这样的:

3-28.jpg

所以,我们放弃了Shader Forge ,而官方Standard Shader目前最大问题是其在移动设备上的性能很低 ,只能等之后版本改善再使用。

3-29.jpg

在测试之后,对于材质系统结论就是:用美术易懂的方式,程序来制作Shader,而后提供给美术使用是最好的方式

所以,我们决定做一个兼容中低端移动设备的材质系统,并规定了三个原则

  1. Shader的优化责任是在程序身上

  2. 让美术人员在有一定限制又能较为自由的去使用它

  3. 程序制作局部的部件,美术只负责合理组合使用这些部件

在最初开发的时候,第一次尝试使用的是Uber Shader 方式:

  1. 在一个大的Shader上使用所有效果,然后用#if 语句选择使用哪一个

  2. 优点:程序容易控制(容易写)

  3. 缺点:效果组合多,Shader的总量增大

效果越多,代码量越多,最终无法灵活管理臃肿的Shader代码。

3-30.jpg

所以,现在我正在开发新的方法实现:Micro Shader + Node Class Hierarchy。

3-31.jpg

为了适应中国复杂的设备环境,我还特意开发了能够根据设备配置不一样,实现自动匹配不同的材质效果。我想这样能够减少程序员和美术的工作负担。

3-32.jpg

后面还有更长的编辑器、演出系统和程序开发经验,但篇幅有限,这次就分享到这里。虽然我是韩国人,但是我很喜欢中国,如果对于我们这款游戏的相关次世代技术,有想交流和咨询,或在北京深圳愿意和我们一起开发做高品质游戏的,都可以加我合伙人的微信号zhangyangqi咨询。