Unity 技术开放日 | 绝对干货 -《黎明之海》如何打造以假乱真的海洋系统?
2021/06/23242 浏览综合
在Unity技术开放日-北京站活动中,我们有幸邀请到搜狐畅游引擎开发专家张华为大家介绍手游《黎明之海》的研发技术。张华老师详细解读了如何基于 Unity 定制 24 小时昼夜交互系统,并分享了一套针对手游和端游项目定制的模拟移动端真实海水起伏动态真实感变化的交互系统。
本文节选了部分精彩内容,完整录播已上传至B站。
B站链接:
大家好,我是搜狐畅游《黎明之海》的项目组组长,我接下来分享一些经验、以及技术方面的内容。

首先是如何基于Unity定制24小时昼夜交互系统,然后分享一下手游的优化经验,最后简单说一下如何丰富DIY角色定制。
首先第一个模块,基于Unity如何定制24小时昼夜交互系统。
昼夜交互系统,需要有以下这些内容:日出、日落、星海、夕阳、天气变化(如狂风暴雨、晴空万里等天气)。
首先来看几张图,这是我们游戏渲染图。



这个昼夜系统刚才也说了,就是平常说的可能大家研发过程中听得比较多的TOD(Time of Day)系统,我们相当于是整个美术使用时候支持24小时气侯变化,包括雨、雪、雾气的各种天气变化。
目前已经完成的模块有如下这几个:
在说技术要点之前我需要强调一下,我们这边做的东西主要是想给美术比较高的自由度,所以我们并没有让美术画天空盒,而是基于程序化天空。熟悉过引擎代码或Shader这块的同学都知道空气密度、Rayleigh散射这些算法,我们基于网上比较流行的一些大气散射算法,在手游上做了一些简化,基本上在手机上可控。
高度雾这块我们加了纵向,高度深度,包括基于海水的海拔进行多重效果的叠加调整,包括各种颜色的控制,可能会纵深感等等雾气效果比较好看一些。云这块后面我也有截图,我们云比较丰富,有支持实时运算的云、也有美术自定义贴图加的云等等。
下面这张是我们游戏编辑器里截的TOD效果图,这是实时的。

还有一个点要提一下,我们的游戏类型比较特殊,是个海上项目。首先是海上的东西比较少,其次我们支持全天候24小时变化,在控制性价比的同时做了全天候24小时实时效果,当然也有陆地、港口场景,后面说一下这种场景怎么做。
再有是晚上的效果。

下面是我们的副本,拼出来马尔代夫夜光沙滩的副本。

说到技术要点,其实并没有太多非常高深的技术,主要在于精细度,包括组合包括编辑器这块怎么好用,让美术尽快迭代出场景效果。
技术要点这块,我们先说一下多样化的天气。先看雨水,我们雨水做了好多层。

比如屏幕上雨水流,在屏幕上这种感觉,包括里面有两层雨水,有一层是特效,有一层我们通过代码实时计算的,包括场景中这种雨包括地面湿润效果,包括后面看的角色身上比较湿的效果,甚至闪电等等相关效果。

为了快速迭代,我们并没有让美术做下雨下雪的角色和场景模型,因为那个代价太大。我们都是通过代码自动计算出来的,有简单的也有复杂的。
我们这套TOD系统,还有一个比较大的模块就是海洋系统,我们做了多套海水系统,主要是为了适配各种机器,其实我们早期是只有一套通用海水系统,因为《黎明之海》三端统发,包括PC,所以我们基于PC及一些高端的手机做了一套新的海水系统。
这个我给大家看一下我们通过这一套实时TOD系统大概能达到的效果,这里面的海水可能是我们比较通用的海水。

我来分享一下烘焙TOD中大家可能用的比较多的,并且可能会带来一些问题的地方。比如我们想做场景烘焙TOD系统,这块首先想到的是烘焙多套lightmap,如果通过代码进行切换融合表现一些更精确化的效果,这套我们的系统是支持的,但考虑到要烘焙多套lightmap,一个不能烘焙太多,我们只在极个别地方,比如在陆地场景中,有用这个方案。
我们最后选用的方案是烘焙一套lightmap贴图,在代码中实时控制间接光照和有shadowmap的强度。当下有些手游其实很多也用了TOD系统,但大部分只有一个光照方向。我们也参考了这一点,因为只要光照的方向不变,光照的颜色强度都是可调的,所以这是我们用的比较多的烘焙TOD这块的编辑,非常简单,虽然不是物理正确的,但细调一下可以达到以假乱真的效果。

这块的优势是对美术和策划比较友好,我们编辑器界面大概是这样的界面,我们通过可调的参数,美术不需要运行编辑器,直接实时调就能看到效果。

这是刚才说Day Profile系统,美术很快可以上手这套系统。我们用的比较多的是曲线系统,后面会计划把下面的曲线系统再优化一下,相对来说不太影响工作效率。
下图的颜色编辑器是我们自己写的界面,Unity出于性能的考虑,关键点数量最多只能打8个,8个点完全不太适合模拟24小时TOD系统,我们基于Unity原始组件系统修改后可以打任意多个点,这样美术就比较好编辑,在第几分钟做什么颜色插值都可以比较容易。这块照着Unity网上渲染UI这块的技术可以直接写,会稍微麻烦一点。

然后就是说到下一个模块,刚才说TOD系统里有一个不可避免的系统就是海洋交互系统,这块是我们游戏的特色。
我们对海水的要求比较高,船只航行在海上需要有随着波涛上下起伏的变化,除了渲染这块,制作海水最费的就是海洋的真实起伏。外面有些游戏可以把大起伏通过比较复杂的计算,通过Hodini或3DMAX把起伏的序列图提前渲染好,运行时直接加载,虽然浪费了一点内存,但这块的计算就可以省了。由于我们这套已经有刚才视频演示的比较通用的海水了,所以我们想的是24小时的任意时刻都可以任意改变海水起伏的大小,包括惊涛骇浪的效果。所以虽然在手机压力比较大的情况下,我们还是做出了真实的起伏系统。
这套系统只在中高位机器上进行模拟,中低端机器还是用比较普通的海水。
先说对配置要求比较高的海水,为了做真实的海水起伏,我们用了通用着色的计算,在一些支持GPU异步回读的硬件平台实现了更自然的海水大起伏模拟查询系统,并且实现了多层级LOD海水变化,进一步扩展了更真实的基于物理光照的海洋材质效果,现在大部分好点的手机基本都能支持这套系统。唯一遗憾的是GPU异步回读功能,可能大家有了解过这一块的人知道这块GPU异步回读是把比较复杂的计算在GPU端渲染之后拿回CPU,CPU直接读,虽然有几帧的延时,但可以直接回读这些算好高度数据,这样比如有很多船只采样点的时候可以非常快速的通过GPU渲染之后,拿好数据应用到船只跟着海水就起伏了,如果在CPU,因为我们用到贴图比较多,包括船只比较多,对CPU开销非常大,所以我们虽然支持CPU,但没有开启。
这是两套海水效果对比。

这块的技术点,先说一下网格,这里我们调研技术比较多,一个是根据相机视锥,把网格分在相机视锥里;另外算Mesh的时候,相机附近的Mesh会非常密,而远处的Mesh基本就不怎么动了。波形有一些LOD的控制,做了多层级IOD Mesh的渐变。

对于GPU异步回读这款,目前我们支持所有苹果手机和PC端。Android部分的后续在我们打通Vulkan动态切换之后会考虑也打开。当然,这套系统体现了我们引擎这边对于技术的执着,不太想为兼容低端机做一些取舍。
另外感觉这套真海水对我们海水非常有用的,这个东西可以任意做大起伏,相对来说一些渲染成动态序列帧的图,包括我们最原始的海水模拟都不太适合做超大起伏,模拟也不够真实。
这套系统目前为止支持很多手机,因为我们做了非常细的渲染分级。

海水起伏大的时候浪会打到船上,镜头会迭进海里,所以我们直接把海水下方的效果也一起做了。
从细节点上来说这套海水的优势在移动端也跑起来了,现在PC上好看的海水效果非常多,但在目前能在移动端跑起来而且效果比较好的还不太多,这也是我们的一个突破点。
有一个细节点,大家可以看到左边这张图和右边图浅滩效果有点不一样。

左边这张图经常露馅,难以算到海水岸边的深度,右边的效果明显更好。在这个地方我们是做了一个尝试——现在右边的海水是缓慢降低,在岸边我们多渲染一遍岸边的山体,为了从上到下记录离海底有多深,这样完全可以通过这个深度界面精确控制,到岸边时候把海水的浪压小,这样不会出现左边这种情况。当然,我们做了四级分级,极高和高配才会看到非常好的浅滩效果。
我们非常想在每个配置上都表现出最佳的效果,但实际上我们还是选择了最大化利用硬件的配置。未来我们非常愿意大胆尝试新的技术,甚至只是在一些少数手机上能用,即便性价比比较低,我们也会愿意尝试相关的东西。
我们在海水上花了很大的功夫,觉得也是很值的,我们不仅用在游戏里,而且比如我们前期宣传的这个海水视频,也是用这个系统做的动画,效果还是很不错的。

这个就是我们实时渲染,美术拿来做宣传动画的效果。
海水这块讲这么多,每个技术点细展开跟大家分享这个时间完全不够,我就把架构图给大家画出来了。

每个点大家如果做过一些引擎渲染开发都研究过,但怎么组合起来用哪些东西,才是需要潜心打磨的点。下面是两个技术论文,我们做了很多参考,都是PC上的效果。
张华老师还分享了DIY 角色定制的精彩内容,欢迎大家前往B站观看完整版进行学习。
B站录播: