- 0
- 0
- 0
分享
- Unity技术开放日 | 绝对干货 - 基于Unity开发跨平台的主机级体育游戏
-
2021-11-26
在 Unity 技术开放日-深圳站中,黄翔老师从基于 SRP 针对体育场景专门写的渲染管线;神经网络肌肉,cloth;基于 Unity 主机、移动端跨平台三个方面,分享了开发跨平台主机级游戏的经验。

望尘科技CTO黄翔
大家下午好,很开心在这里跟大家分享我们公司在体育游戏上的开发经验。首先自我介绍一下,我是 Gala Sports 的创始人黄翔。我自身是一个 Unity 的老用户,一直在用 Unity 开发游戏。

接下来介绍一下我们公司,GALA Sports,公司在深圳,到现在差不多成立了有 9 年的时间,差不多 300 人。我们应该是国内做体育游戏最专注的公司,到目前为止,我们已经拿了 NBA、国际足联和十几多俱乐部的版权,因为体育是个世界性全球化的题材,所以我们的游戏在海外的的增长还不错。

这是我们正在开发的产品,预计会在明年第一季度上线。

这是在 iPhone11 的设备上录制的,使用了新的 URP 管线再结合定制的渲染算法模块,实现了非常接近于 PS5 的画质,接下来我就具体介绍一下是怎么做到这个效果的。
首先说一下场景渲染。
场景渲染有一些常规操作,比如做非常细致的 Lightmap 烘焙,把 Light Probe 在场上分布好,线性空间 shading,级联 RT 测光(每一帧要根据上一帧渲染的结果来调屏幕的光照强度),最后做 Tone mapping。夜晚场景有一个柱状灯光的雾气效果,是用积分 Cone Light 体积光公式计算的解析解,有一篇知乎文章讲解原理可以搜到。

在这介绍一个创新点,一个大型的球场能容纳10万名观众,我们是如何做到同时渲染这么多观众的呢?
这里我们采用了一种叫做聚类代理渲染的方式。先把场上的观众分成不同的组,不同的组可以做不同的行为,面向摄像机的角度也不同,实时地根据球场观众的动作以几十帧为单位进行分组。分完组之后每一个观众或者每一组观众实际上是渲染成一个观众到缓存里,然后再在屏幕空间Shading不同的衣服颜色和花纹、肤色,实现观众的多样化。

这样就可以做到非常高的场景渲染质量。我们的竞品场景在 PS5 上,用了 2000 万个三角面,我们只用了 40 万的三角面,就达到了非常接近的画质。

这是 3D 的近景,可以看到每一个观众都是真实的 3D 角色,不是面片人或者纸片人。

第二步讲一下角色的身体渲染。
身体的渲染的目的是让身体尽可能真实,我们的目标是需要实现一个函数式映射,通过输入 AI 或者玩家控制球员的姿态,就能够输出非常高质量的身体肌肉的平面和衣服穿在身上的布料表面。但是这样的物理计算是非常复杂的,有很多电影软件可以实现这样的功能,但那是做离线的物理渲染,一帧就要几分钟。我们怎么在手机端做到 60FPS,并且同时做到多人的计算呢?

我们借用了电影行业里面的经验,首先离线生成物理计算数据。下图是其中的一个片段,这样的动作片段我们可能做了几千个,有十几万帧的数据。它的解算是一个序列的过程,从解算关节点,到解算肌肉、筋膜、脂肪、皮肤,再把衣服穿上去解算衣服,这是好莱坞做电影角色的标准化过程。


我们拿到衣服和肌肉的数据后,就进行频率分离,把它拆成高频和低频两部分。因为每个物理模型解算出来之后,顶点的数量是非常多的,光上衣有 5 万个顶点,有 10 多万的三角面。我们把它进行频率分离,分成低频 Mesh 模型和高频衣服的褶皱,褶皱用法线贴图来实现。

这是我们所生成的大量训练数据,是用一个渲染集群来算出来的。

我们想把所有数据用于游戏里面是不可能的,这些数据加起来有十几 T 的数据,我们首先尝试的方法是做 PCA 分解,也就是主成分分析,通过 PCA 分解就能找到一组基向量,让所有的数据表达都能够成为一组基向量线性相加的一个结果。它的代码实际上是非常简单的,这是 Python 的计算代码,计算过程非常简单,几十万的法线图只需通过 50 张法线图的基来描述,顶点也用同样的方式来实现。

这是重构的效果,可以看到原图和重构的效果非常相似。经过测试以后,如果有 50 个基数据,它的效果还不错,可以达到效果和性能的平衡。

接下来我们做了一个采样优化,把它压缩成为 3D Texture,因为压缩成为 3D Texture 可以只采样一半,每一次采样只采中间的位置就能同时采样两张贴图,把采样的数量降到 25 次。

但是这样有一个问题,就是在渲染的过程中,一个场上有 22 个球员,当有好几个球员的镜头非常近的时候,屏幕上衣服区域要进行 25 次采样。这个采样对于手机来说,高性能的手机是没有问题的,低端的手机还是会有开销的问题。
这个做完之后要找进一步提升性能的方法,在与苹果沟通的过程中我们发现,苹果和其他所有安卓的主流手机中都有一个神经网络的专用芯片,这个专用芯片绝大多时间是闲置的。而且这个专用芯片的计算性能非常快,快到什么程度呢?基本上相当于完整 GPU 的 80%。

我们就想是不是可以用这个芯片来干一些事情。虽然只看 CPU 和 GPU 的话,手机芯片的性能要远远低于主机芯片,但是在加上了神经网络芯片之后,它的性能就可以大大提高了,甚至足以媲美主机的性能。
所以我们把 PCA 计算流水线改成了一个这样的过程:低频的部分用全连接的神经网络实现顶点的计算,高频的部分用卷积神经网络来实现法向贴图的计算。这个视频是实时在 Unity 里实时计算的效果,通过神经网络,实时改变 Pose 人关节点的旋转能够输出对应的肌肉与衣物的物理计算。

跟苹果的 DR 团队进一步优化之后,我们能够在新 iPhone 上跑到 400-800帧/秒,远远超过我们的预期。
但这还不够,因为我们只是解决了物理形变的问题,还没有解决光线照射的问题。因为场上的球员一直是运动中的,实际上我们将其中的某一个 Pose 拿下来进行计算,光照的数据显示下来是这样的效果。
角色身上的光照非常丰富,现实中光照是复杂的光线追踪的结果,既受环境光的影响,也有光在表面褶皱间的弹射,也有身体和衣服之间 AO 的影响,也有身体受衣服光照的影响,也有草地对于整个人身体的影响,那这个计算同样也是不可能实时来计算的,烘焙这张图差不多要一分钟多的时间。

我们的解决方案同样采用神经网络,把网络里面的顶点法线、AO 贴图(环境光遮挡)、表面光场(每个顶点在离线时生成半球面球谐数据)encode 到神经网络,让神经网络把这些都 pose 到表面光照的映射都记住。可以看到当手抬起来的时候,手对于身体有非常真实的物理光照遮挡,这个视频左边是原始数据(Ground Truth),右边是神经网络数据,肉眼几乎分辨不出差异,这个计算可以跑到 200FPS,因为是在专用的神经网络芯片上计算,所以不占用 GPU 开销,也不占用 CPU 的开销。

最后我们在开发过程中把所有的东西都合到一起的渲染。
左边是用传统方法 skeleton skinning 的效果,右边是所有东西加到一起之后的一个效果。可以看右图到有非常明显的肌肉、光照阴影、AO 等细节,这个质量远远超过了今年最新版在 PS5 上发布的主机版的游戏。

我们做了一个 ML 插件,在 iPhone 上用 Core ML 把几个网络 Stack 到一起放入插件,安卓也是以同样的方式来实现的。

第三点分享一下角色的面部渲染。
我们的工作流程是用 iPhone ARKit 录制的面部表情的运动,对于手机端的体育游戏来说,因为球员离得比较远,所以 iPhone ARKit 基本上是够用的。ARKit 把角色面部表情拆成了 51 个 Blend Shape,我们用这 51 个 Blend Shape 来实现这套流程,有很多开源的第三方软件都可以直接录。

人面部表情顶点在运动的时候,它的光照也发生了非常丰富的变化。特别是眼睛和口腔,眼睛开闭之间对于眼组的变化和口腔的光照变化。这两处的光照变化是非常重要的,要不然就会发生我们在游戏中所经常看到的游戏主角的牙齿过曝,像是满口大金牙。这个问题我们是怎么解决的呢?

我们用了相似的方法,把光照的参数作为基向量全部 encode 到 51 个 Blend Shape 中,根据面部表情的变化带动面部光照发生同样的变化。这是手机上测试的开发效果,可以看到口腔里面的光照是基本上是正确的。

体育游戏中,角色运动是重中之重,黄翔老师还分享了他们制作角色运动的经验,欢迎点击“阅读原文”跳转社区学习:
https://developer.unity.cn/projects/619f5b86edbc2a54c3c84b28
体育游戏在海外的整个游戏行业里面差不多占据了 20% 的市场份额,但是在中国只有 5% 不到,所以国内国外都有巨大的增长空间的。Gala Sports 只做体育游戏,目标就是做出世界最高质量的体育游戏,同时基于游戏的写实数字人、球场姿态捕捉等技术,能够给体育行业带来一些技术上的革新。Gala Sports 常年招募游戏、渲染、AI 相关的工程师,欢迎大家扫码添加 HR 的微信。

-
阅读原文
* 文章为作者独立观点,不代表数艺网立场转载须知
- 本文内容由数艺网收录采集自微信公众号Unity官方平台 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。