《闪耀暖暖》开发者:从美术设计解答换装游戏
编辑:admin
字号:A-A+
摘要:5月11日-12日,由Unity主办的行业开发者大会Unite Shanghai 2019在上海国际会议中心召开。会上,叠纸游戏公司技术总监张霁和美术总监柳丛以“闪耀暖暖技术分享:2D到3D的进化与创造之路”

5月11日-12日,由Unity主办的行业开发者大会Unite Shanghai 2019在上海国际会议中心召开。会上,叠纸游戏公司技术总监张霁和美术总监柳丛以“闪耀暖暖技术分享:2D到3D的进化与创造之路”为主题进行了演讲,阐述了他们在开发3D手游《闪耀暖暖》过程中所发现的问题与解决的困难。

以下为游戏陀螺演讲整理内容:

大家好,很荣幸在Unity2019中分享《闪耀暖暖》的思路与收获。这次分享是由两个人共同完成,我叫张霁,从事游戏行业8年了,2016年初加入叠纸,参与《闪耀暖暖》的研发,今天我会给大家分享一些引擎自定义和工作流的内容。

另一位演讲者是柳丛,他有十几年的开发经验,之前参与过多款次世代游戏的美术研发,今天他将带来一些美术效果的研发心得。

技术总监张霁:引擎自定义和工作流的内容

关于《闪耀暖暖》,这是叠纸的第二款Unity项目,我们用的引擎版本最初是Unity5,去年升级到了Unity2018。《闪耀暖暖》是暖暖系列的第四代产品,也是叠纸的首款3D手游。

卡通渲染陷入瓶颈期:很难做到期望的品质

项目开发前期,我们经历了一些技术和风格上的迭代,起初它甚至并不是一款3D游戏。初期的尝试方向是基于spine来做360度旋转,后面很快转向3D方向。这个时期我们更多考虑的是如何用卡通渲染还原2D暖暖,如何还原2D暖暖的线条,让3D线条有颜色粗细虚实的变化,这是当时做到的效果。

在2016年下半年的时候,对卡通渲染的研究进入了一个瓶颈期,因为想做到期望的品质,要求非常的高,对移动平台压力过大。同时3D线条的效果与2D暖暖仍然有较大差距。即使这个差距可以继续缩小,卡通渲染导致的画面过于相似也会让新作缺少独特的吸引力。

这迫使我们回到原点思考问题,换装游戏的根本究竟是什么?我们的答案是漂亮的衣服和多样的穿搭体验。我们将其拆分成几个技术点:衣服的极致细节、穿搭的自由度,以及艺术的传承和创新,这也是我们这次分享的目录。

使用多层UV和多层贴图拼合 实现精度的最大化

首先是细节,暖暖系列的基石。3D游戏要想达到足够高的精度,制定合理的美术规格是重要的基础。我们发现模型面数对性能的影响并不是很大,影响较高的是贴图的分辨率。这是使用1024和2048贴图的表现效果,以及相应的AB占用和渲染耗时。可以看到即使2048在镜头拉近的时候仍然无法达到我们希望的精度,而随着分辨率的增加,包体内存压力迅速增加,也不利于持续更新。

为了解决这个问题,我们使用多层UV和多层贴图拼合,这是达到的效果。精度有了显著的提升,相当于4096的贴图。这个例子里使用了四层UV,四层贴图,总的占用比1024的单张贴图还要小。《闪耀暖暖》的包体目在是二点几G,有一半是3D的容量,其中一半是贴图。如果把这部分全按4K重置,包体会达到十几G。接近一款3A游戏了。同时加载多张4K贴图更会直接撑爆手机内存。使用多UV其实也有巨大的代价,渲染耗时从6.85毫秒到8.67毫秒,增加了26%。

我们对UV的优缺点做了总结,除了精度和包体优势,还有一个好处,就是在制作完成后,有较大的后期调整空间。缺点方面,除了pixel shader负荷增加较多,多UV会导致贴图数较高。Unity默认采样器的数量等于贴图的数量,这样就要求控制单个材质中贴图的使用,不能超过16张。

除了硬件和性能上的问题,多UV对于制作也有较大影响。设计时需要考虑图案规划,而制作时需要根据情况对UV进行调整和拆解。例如这个比较简单的裙子,它的UV是这样的。从另外一个方面,UV拆分过于灵活,也会导致这个流程难以推广和流程化。

针对这个问题,我们制定了一套工作流来进行标准化,首先是色块填充构成底色,平铺布纹,接下来印花,最后是风格化处理。对于复杂的服装,可以灵活变通,实现精度的最大化。

通过程序化方式进行细节补充 如何程序化闪点

对于一些用贴图也达不到预期精度,我们会通过程序化方式进行细节补充,比如珍珠和宝石等。作为例子,分享一下程序化闪点的实现方式。

首先,这个是我们期望闪点能够做到的内容,其实就是一些随机分布的点,点与点之间有一些表现颜色和大小的随机性差异。美术希望能有方便直观的控制方式,比如用密度贴图控制哪些地方需要有更多的点。同时,点的大小分布也能以类似的方式进行控制。其次希望有稳定可靠的闪烁,类似高光的表现。

闪点算法的基础其实很简单,其实就是在UV空间上生成棋盘格,这其实是一个2D的问题,我们可以转化成平面进行考虑。每格的索引就是随机数种子,使用这个随机数种子,可以生成偏移量、缩放和颜色和相位。接下来是填充格,可以直接填满就是方块。或者柔化处理成菱形或者圆。接下来是根据相位和预设的密度阈值进行剔除,达到密度控制。

处理偏移的时候,会出现越界的问题,就会出现截断的情况,看起来比较奇怪。处理越界闪点的方式,就是随着点随机缩小,把偏移量限制在格内。但是这样过于规律,几乎看不出什么变化。后来我们发现只要限制点的中心在格里就可以了,这样一共是自己加周围8个邻居,共9次闪点相关的计算。可以利用一些情况来合并计算。由于点的中心不能出框,左邻居只会影响当前格左半边的像素,右邻居只会影响当前格右半边像素,左右两半边可以合并计算。同理,上下两邻居也可以合批计算,四个对角也可以合并计算。上下左右加边角加自己,只需要计算4次闪点相关计算。

此外,还可以利用GPU的向量计算能力进一步减少计算量。对于偏移等float2计算,可以两两合并为一个float4;对于缩放等矢量计算,可以四组合并,这样最终的开销略小于两次完整的闪点计算。

最后是闪烁处理,我们的处理方式是利用刚才随机生成的相位值调整nh,进行高光计算。同时用一个统一的闪点光滑度控制闪烁程度。

如何管理shader材质?

由于我们使用了多UV,加上刚才各种材质特性,还需要实现不同光照模型,这样就会导致我们的shader变成一个庞大的uber shader家族,如何管理shader材质是一个重要的问题。

在工作流方面,一个自定义的材质面板是非常好用的工具,它可以在同一组shader中进行切换。同时可以开关feature,根据特性集来动态调整面板,还可以结合自己的工具进行性能分析、监控和预警。在发布和runtime方面,海量变种对编译速度非常敏感,我们去年把引擎版本从5.6升级到2018,因为2018修复了5.6的重复编译bug,同时大大提升了shader的编译速度。

光照系统:希望有更丰富的光照变化

接下来介绍一下光照系统,由三部分组成,预烘焙的环境光、主灯以及轮廓光。希望有更丰富的光照变化,单LightProbe的效果太单调,没有场景,只能烘焙一个预设的Cubemap。我们的解决方法是沿竖直方向增加LightProbe采样点,让美术增加点光源和方向光作为额外光源,将其直接关照和Cubemap一起合并到环境SH,运行时根据世界坐标的高度在vs中进行插值计算环境光。

如何处理轮廓光?

轮廓光方面,可以强调角色轮廓,增强体积感。使用轮廓光的时候,发现很多衣服存在漏光的问题,这是因为轮廓光没有ShadowMap计算。注意到漏光区域主要是局部形体,我们可以对Mesh静态结构进行预计算。

在模型导入在T-pose下后计算网格每个顶点的遮挡信息。对于每个顶点,在其球面上发射若干条阴影光线,进行碰撞测试。对于每条阴影光线,将其转化到对应顶点的切空间,并将阴影测试的结果累计入2阶SH中。最终结果是4个浮点数,可以把结果存到顶点色中。运行时把轮廓光转换到切空间采样SH进行遮挡判断。

这个是做到的结果,左侧是有轮廓光的,中间是轮廓光+遮挡,可以看到漏光形象大为缓解。因为SH近似存储所有遮挡信息,动态情况下也可以工作,即使增加轮廓光,也可以用这个方案进行统一解决,性能开销不会显著增加。

如何处理阴影?

下面是阴影处理,由于Unity5的阴影不支持半透明物件投影和受影的,我们自定义了shadow pass。同时根据相机与人物的关系可以提升ShadowMap的利用率。我们把人物的包围体按竖直方向细分,根据相机和每个小段的相交结果,调整的投影矩阵。

下面是Shadow Map的情况,右侧是关闭自适应阴影,左侧是开启,可以看到阴影质量得到了相应的提升。

角色的面部是一个重点关注区域,头发尤其是刘海处的投影如果用不透明方式处理会显得过于生硬。我们的处理方式是使用Screendoor Depth,每4×4像素为一个tile,每像素根据透明度值来顺序丢弃写深度操作。可以看到最后得到的ShadowMap,头发末端有一个点阵的状态。再用一个单独的四分之一大小RT,对皮肤做屏幕阴影蒙版,再进行模糊处理,以获得半透明的阴影效果。

这是最后实现的效果,我专门挑了几个在刘海部分模型非常接近的头发,仅有贴图差异较大,可以看到左边一个,它的半透过渡比较柔和,所以它的阴影也就会淡一些。而右边的实体区域比较多,所以阴影比较锐利。

对于正常投影难以表达的微小部件,或者程序化生成的模型,我们会调整bias,以达到强化阴影的效果。

穿搭组合的自由度:在基础骨架上编辑人物的碰撞体配置

第二个重要的点是穿搭组合的自由度,也是换装游戏可玩性的支持。由于暖暖系列中衣服版型设计多种多样。我们的绑定设计分为基础骨架和扩展骨架两个部分。

基础骨架确定以后,可以在其基础上编辑人物的碰撞体配置,而扩展骨架则需要设置其物理参数。两部分数据合在一起,在运行时,由物理系统计算其动态效率。

由于移动平台性能有限,暖暖系列衣服复杂度又比较高,即使是PC平台也无法完全使用布料系统来做到我们想要的效果。我们的物理系统是一个链式迭代的质点系统,粒子之间可以添加弹簧,用这种方式可以做到简单的布料模拟。

扫描对我们来说,意义就是两点,一个是还原真实,一个是高效产出。我们操作的时候,发现扫描模型几乎不可能直接使用,很多东西需要修改,但是扫描出来的东西有一个符合真实的外轮廓,这个东西,很多美术制作人员在制作的时候很难抓准。但是对我们来说这个不是最重要的,产出对我们来说才是非常重要的,我发现投入制作后效率提升了700%,不仅提高制作效率,也降低了反馈成本。

这是我们使用3D扫描仪的实录,非常快就可以得到所扫描物体的高模模型数据。

游戏媒体对柳丛的采访

提问:在提高效率方面有什么建议吗?

柳丛:效率的话,其实现在游戏行业的开发软件以及一些新的工作流程,在这两年更新的非常快。我觉得大家应该多了解一些行业中新兴的东西,再想办法把新兴的东西和好的工具融入到自己的工作流程里面,这样能帮助我们有效的提高工作效率,我们现在在这块也做了很多的探索和努力。

提问:你好,产品系列有很多不一样的部分,那么对不同风格的把控,你有什么样的偏向?比如说之前做调研,你可能更喜欢哪个风格往这个方面偏向?

柳丛:这个问题并不存在,我们做这个游戏的时候考虑到它应该是一个包罗万象的产品,我们想要去呈现3D极致百变的风格,不可能只针对玩家喜好去做一些迎合,比如说玩家喜欢什么我们就多做什么,这是不存在的。并且暖暖系列游戏有它自己的世界观设定,游戏里的奇迹大陆有七大国纪,每个国纪都有自己独特的服饰风格,所以在《闪耀暖暖》里你能看到不同风格的服饰,像古风、科幻、个性化的,也有日常的。

玩家喜欢的东西是很多元的,我们要做的是在游戏里给玩家带来更多的展现,让他们可以在这里能找到属于自己的那一份满足。我们不会去限制这些东西,反而我们会想去做更多来满足玩家,我们也有去做一些符合当下时尚潮流的设计,满足玩家对当前潮流的需求。

作者:admin 来源:未知 发布于2019-05-20 10:15
本文版权归原作者所有 转载请注明出处 收藏:
您可能喜欢的文章
热门阅读