Unity 技术开放日 | 绝对干货 -《黎明之海》如何打造以假乱真的海洋系统? ... ...

2022-2-27 17:19纤纤 1067 0

Unity 技术开放日-北京站活动中,我们有幸邀请到搜狐畅游引擎开发专家张华为大家介绍手游《黎明之海》的研发技术。张华老师详细解读了如何基于 Unity 定制 24 小时昼夜交互系统,并分享了一套针对手游和端游项目定制的模拟移动端真实海水起伏动态真实感变化的交互系统。

本文节选了部分精彩内容,完整录播已上传至 B 站。

B 站链接:

https://www.bilibili.com/video/BV1r44y1z7X3?p=7

大家好,我是搜狐畅游《黎明之海》的项目组组长,我接下来分享一些经验、以及技术方面的内容。

首先是如何基于 Unity 定制 24 小时昼夜交互系统,然后分享一下手游的优化经验,最后简单说一下如何丰富 DIY 角色定制。

首先第一个模块,基于 Unity 定制 24 小时昼夜交互系统

昼夜交互系统,需要有以下这些内容:日出、日落、星海、夕阳、天气变化(如狂风暴雨、晴空万里等天气)。

首先来看几张图,这是我们游戏渲染图。

这个昼夜系统刚才也说了,就是平常说的可能大家研发过程中听得比较多的 TOD(Time of Day)系统,我们相当于是整个美术使用时候支持 24 小时气侯变化,包括雨、雪、雾气的各种天气变化。

目前已经完成的模块有如下这几个:

  • Day Profiles 文件系统:用来存储多个 24 小时 TOD 变化文件;
  • 气候控制模块:控制在 24 小时 TOD 轮转时突发的气候变化,如雨、雪、浓云密布等等气候效果;
  • 声音控制模块:控制天气或气候变化的时候的声音同步效果;
  • 高度雾控制模块:集成了新开发的高度雾控制;
  • 日历系统模块:目前开放了可供美术编辑的多个 24 小时 TOD;
  • 天空系统模块:包括日光夜光、太阳月亮的动态变化;
  • 后处理控制模块:可以控制 Unity 官方提供的 PostProcessing,以便可以更好地让后处理效果跟随 24 小时 TOD 进行变化;

在说技术要点之前我需要强调一下,我们这边做的东西主要是想给美术比较高的自由度,所以我们并没有让美术画天空盒,而是基于程序化天空。熟悉过引擎代码或 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 上的效果。

http://advances.realtimerendering.com/s2017/index.html

http://advances.realtimerendering.com/s2019/index.htm

张华老师还分享了 DIY 角色定制的精彩内容,尽在 B 站「Unity官方」频道。欢迎关注官方账号,学习更多精彩教程。

B 站录播:


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-6-25 09:25 , Processed in 0.046939 second(s), 18 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.