我想谈谈关于次世代游戏的话题。首先,我们想为用户提供高品质的游戏体验,目前手机主流的3D画面是这样的。
虽然比以前的画面有很大进步,但还可以做的更好看,比如这样的:
如果是身穿铠甲的战士,他应该是这样的:
或者这样的皮革感觉:
所以,我们选择做高品质的次世代游戏。
开发次世代游戏会有2个主要的选择,Unreal 和Unity。所以,我们遇到的第一个问题就是,应该选择什么引擎?
先来看画质对比:
这是一个UE4 Infiltrator Demo的截图,品质很高:
但PC GPU 性能是要远超Mobile GPU,所以这个demo只能运行在PC 的GPU上,而无法在Mobile设备上运行。那么UE4在移动设备上是什么样的情况呢?以两款三星手机中的画质来对比:
可以看到UE4,在高中低端手机上,实现的效果差距很大,那么Unity的情况呢?是这样的:
可以看到,虽然有一定差距,但是不那么明显。在苹果家族,iPhone5 以下都只支持OpenGl ES 2.0,也就是低端手机。
经过详细测试,我们发现:
Unreal4在高端设备上表现优越,而中低端设备画质下降非常严重:
Unity 在高端设备上没有Unreal4表现出色,但是在中低端设备上画质上较为不错,远超Unreal4的表现。
除了画质之外,在具体开发效率上,Unreal4也不如Unity
总结下:
Unreal4 Mobile还属于开发当中,只支持高端设备
Unity在中国市面上有大量设备可供支持发挥
Unity对程序提供很高的开发灵活度
因此,最终选择了Unity引擎来制作次世代游戏。
在确认使用Unity引擎之后,为保证高品质,制定了四个目标:
不想修改Untiy源代码 (修改源代码会造成很多不可预测的BUG)
保持高效率开发 (主要是C++性能和C#效率的综合使用对比)
在Unity实现原本无法实现的高品质画质 (重点)
开发美术方便使用的材质系统,且兼容中低端设备(重点)
【在Unity实现原本无法实现的高品质画质】
“在没有源代码的情况下,Unity可以改善到什么程度的画质? ”这是经常钻研的一个问题
先看一些Unity游戏的例子:
《Ori And the blind Forest 》,很好的表现了奇幻氛围 ,虽然是pc游戏,但是如果努力这种程度在手机上还是可以实现:
《聚爆Implosion 》,不足之处,安装包超过1.3G。
如果想制作同样水准的次世代品质的作品,安装包又希望只有100-200MB,这是一件很有难度的事情。我是这样解决这个问题的。
以这个Unreal4 Mobile中的场景为例,Real HDR(HDR = High Dynamic Range)是如何实现的呢?
先来了解Unreal4的实现机制:
如果在中低端设备就会出现这样的情况:
所以,中国市场超过90%以上的安卓机型,次世代游戏都会因为信息的缺失而无法显示HDR效果,导致巨大的画质下降,怎么办呢?我们想了一个办法,“用RGBM 形式将曝光的luminance 信息储存在alpha当中”。
然后“利用储存在alpha的luminance,以它为基础进行了bloom,使得最终达到HDR效果 ”。
这样,在中国市场绝大部分安卓手机也能实现HDR效果,如下图:
这样的方案,也会有一些局限性,比如:
超出的颜色信息会消失
因为只用Luminance去处理,所以无法实现高饱和的亮颜色(例如强烈高亮的蓝色)
BLOOM效果之外是否可以Tone mapping还是未知 (之后会去尝试)
不过优点更明显:
绝大部分硬件支持
因是使用8bit per channel render target,所以消耗很少的fill-rate,不太占资源,游戏运行时候有更好更高的效率 (对于游戏优化很重要)
【开发美术方便使用的材质系统,且兼容中低端设备】
要制作次世代游戏离不开好的材质系统,好的材质系统能实现这样的效果:
人物的皮肤质感:
因为Unity自身没有提供方便美术开发者灵活使用的材质系统 ,所以只有2个选择:
去Asset Store下载第三方工具(Unity5 开始支持Standard Shader)
程序制作Shader
第三方工具Shander Forge(U3D商城有售),虽然这个工具:
以Node based 方式制作Shader
和Unreal一致的UX (操作界面)
但是最大的问题在于,在中国市场大约30%的苹果设备,和80%的安卓设备都会报错,而不会正常显示。
再加上美术缺乏编程常识,一般为了好效果,最后都会构成复杂的node。
而不是这样的:
所以,我们放弃了Shader Forge ,而官方Standard Shader目前最大问题是其在移动设备上的性能很低 ,只能等之后版本改善再使用。
在测试之后,对于材质系统结论就是:用美术易懂的方式,程序来制作Shader,而后提供给美术使用是最好的方式
所以,我们决定做一个兼容中低端移动设备的材质系统,并规定了三个原则
Shader的优化责任是在程序身上
让美术人员在有一定限制又能较为自由的去使用它
程序制作局部的部件,美术只负责合理组合使用这些部件
在最初开发的时候,第一次尝试使用的是Uber Shader 方式:
在一个大的Shader上使用所有效果,然后用#if 语句选择使用哪一个
优点:程序容易控制(容易写)
缺点:效果组合多,Shader的总量增大
效果越多,代码量越多,最终无法灵活管理臃肿的Shader代码。
所以,现在我正在开发新的方法实现:Micro Shader + Node Class Hierarchy。
为了适应中国复杂的设备环境,我还特意开发了能够根据设备配置不一样,实现自动匹配不同的材质效果。我想这样能够减少程序员和美术的工作负担。
后面还有更长的编辑器、演出系统和程序开发经验,但篇幅有限,这次就分享到这里。虽然我是韩国人,但是我很喜欢中国,如果对于我们这款游戏的相关次世代技术,有想交流和咨询,或在北京深圳愿意和我们一起开发做高品质游戏的,都可以加我合伙人的微信号zhangyangqi咨询。