/【雷火UX带你聚焦GDC2022】《孤岛惊魂6》中的热带天气模拟(Ubisoft:Emily Zhou&Colin Weick)

【雷火UX带你聚焦GDC2022】《孤岛惊魂6》中的热带天气模拟(Ubisoft:Emily Zhou&Colin Weick)


网易雷火UX用户体验中心编译,转载需注明本公众号

关于GDC

GDC是全球游戏行业最具规模、最有权威、最有影响力的专业峰会。GDC2022中,雷火UX共获邀17场演讲,分布在9个核心演讲以及8个峰会演讲,再度刷新中国游戏行业纪录,领跑全球。

每年的GDC大会上,全球顶尖的游戏开发者们将齐聚在这里,交流彼此的想法,构想游戏业的未来方向。接下来雷火UX公众号会选择一部分高质量的演讲,陆续为大家进行介绍。本篇为大家介绍的是育碧资深技术美术Emily Zhou & 资深3D程序员Colin Weick的演讲“Simulating Tropical Weather in ‘Far Cry 6’ ”。
演讲标题:

Simulating Tropical Weather in ‘Far Cry 6’

《孤岛惊魂6》中的热带天气模拟


Emily Zhou
资深技术美术,2017年加入育碧蒙特利尔工作室,参与《孤岛惊魂5》、《孤岛惊魂:新曙光》、《孤岛惊魂6》开发


Colin Weick

资深3D程序员,在计算机图形学和渲染技术领域有着12年工作经历。2016年加入育碧多伦多工作室,参与《孤岛惊魂5》、《孤岛惊魂6》开发

演讲概述

本篇演讲中,两位育碧的技术人员分享了《孤岛惊魂6》中天气系统的实现细节。对天气系统中的湿度效,以及构建中运用的渲染技术做了详细的介绍,并分享了他们的一些实现方案。


01关于《孤岛惊魂》

《孤岛惊魂》系列是开放世界第一人称射击游戏,每部作品的故事背景设定均不同。本作《孤岛惊魂6》将带领玩家进入Yara—— 一个以古巴等国家为原型构建的加勒比海域岛屿。玩家将扮演Dani Rojas,推翻Anton Castillo和他儿子Diego的独裁政权。游戏中充满活力的开放世界是该系列的一个亮点,每个世界都有自己的“生命”,系统之间是不断相互作用的。为了提升玩家在热带岛屿的探索体验,开发团队为《孤岛惊魂6》引入了一个完整的、动态的天气系统。

《孤岛惊魂6》中的各种天气

02游戏中天气系统的控制

Weather Manager是天气系统的核心,它包含了用于定义和控制天气的信息,其中一部分信息暴露在了天气数据库中让美术进行配置。Weather Manager是天气系统的后端,天气数据库则是前端,在项目中可以引用天气数据库中定义的天气预设。《孤岛惊魂6》开发团队用这些天气预设自行设计了不同区域连续五天的天气循环,也为了艺术性放弃了使用真实气象数据。


天气预设

游戏中主要有三个不同的区域:干燥地区、湿地和丛林。不同的区域、子区域都具有不同的天气变化。团队为每个子区域都设置了用于限制天气属性的最大值、最小值曲线,以便跟随玩家移动切换天气。例如,把室内的雾属性曲线设为0可以避免产生雾的效果。
总的来说,整个天气控制流程如下:获取当前时间的天气预设,根据玩家所在位置做区域调整,获得当前的天气状态;然后使用这个天气状态根据时间更新湿度、雨和闪电并输出最终参数。之后就可以用这些参数驱动视觉、音频、游戏玩法等。

天气控制流程

03.  雨天效果:材质湿度

湿度是天气系统的重要组件,游戏中的资产都需要有湿的状态,以便在干湿之间混合。对于这类大规模的游戏来说,直接创建另一份素材,需要增加很多开发时间,而且难以兼容美术团队各自的资产管线。湿度系统需要相对独立,设计得足够精简与通用,且能开箱即用,实时观察效果。当然,有些材质需要展现更多细节,但简单起见,对一般资产应用湿度时不应依赖具体材质。
物体表面湿度增大时,反照率降低,光滑度增加。决定这种特性的是材质的吸水方式。泥土、织物、原木等高孔隙率的材质变湿后颜色会更饱和且暗淡;塑料、大理石、金属等低孔隙率的材质会在表面保持水分而不是吸收,颜色无变化。为了表示这种影响,可使用孔隙率贴图。但是考虑资源总量,也可以改为添加一个孔隙率参数。考虑到孔隙率和光滑度的关联,使用如下方法计算孔隙率。

孔隙率计算

湿度实现中,对不会移动的物体使用静态湿度方案,只在延迟光照阶段处理。静态湿度的优点是简单、一次性可以调整全体,缺点是不灵活;而对于武器、车辆和人物这些湿度增减很频繁的物体,则使用动态湿度方案,每隔几帧用光线投射检测它们是否暴露在雨中。它们还有一个自身湿度参数,反映浸水情况。动态湿度单独应用于每个着色器,可控制更多细节,但是这些着色器的管理比较复杂。
关于人物的湿度,布料增加了光滑度限制,头发只用了一个孔隙率参数,皮肤上则使用了法线贴图和湿度相关设定来呈现表面雨水,其中法线存储在RG通道,湿度存储在B通道。

实现物体表面流淌的雨水

为了呈现表面朝上的雨滴,需要利用法线、ID、高度,用一张RGBA纹理存储。对雨滴进行两次采样,以改变雨滴淡入淡出图样,并通过ID贴图实现不同时间周期。至于随着时间推移会在硬表面上积聚的微小静态雨滴,开发团队设法将它们存在了高度贴图中。

实现物体表面的雨滴

对于植被,开发团队最初应用静态湿度。但是这样的话贴近地面的树干和植物会处在阴影下,没有湿度效果,看起来很奇怪;另外在灰色天空下的均匀反射使得植被看起来像金属。于是最终开发团队对植被也使用了动态湿度。另外在叶子上应用雨滴纹理,解决反射问题。
地形总是在玩家的视野里,而且包含了许多细节,地形湿度的体现也是具有挑战性的。为了呈现雨水落到地面的扩散效果,团队用GPU进行了高度场仿真,使用的参数有干燥度、扩散速度等。可以选择暂时增大地形孔隙率来使沾水的地方变得更暗,突出这部分效果。
地形上还会因为下雨产生水洼。水洼只是地形上的贴花,用纹理的Alpha通道的Gradient值和一个开关来控制是否写入地形孔隙度。同时用孔隙率计算出湿度,然后据此在原本颜色和浑水颜色间混合并改变光滑度。开发团队还制作了应用到所有水洼的法线纹理动画,对于雨点产生的波纹,采样两次法线纹理来实现两层重叠的动画,并且用Weather Manager的雨效果参数控制渐入渐出;对于风产生的波纹,则根据风的方向和强度滚动法线纹理。
04天气系统中的渲染技术

《孤岛惊魂6》中包含了完整的天气变换系统,使用了大量渲染特性:大气散射、体积云、体积雾、反射和Cubemap、雨和闪电,下表展示了对不同材质的渲染方式。

不同材质的渲染

全局光照

美术在场景中设置全局光照探针,每天烘焙场景光照。全局光照数据以体素存储,存13帧数据,其中11帧是一天不同时刻的天空、日月光照,1 帧是主要用在夜晚的局部照明,1 帧是天空遮蔽。天气不能影响这些全局光照探针,但可以在云覆盖率高时减小间接光照。

大气散射

开发人员使用Bruneton于2007年提出的天空模型和Preetham于2009年提出的日照模型,并且做了一些额外的改进,如添加臭氧层。美术制作了四种天空,运行时根据湿度和浊度来进行混合。早期实现可以参考GDC 2015关于《孤岛惊魂4》的光照的演讲。

四种天空的混合

体积云

基于天空盒的云具有极大的局限性,云层运动的视觉效果差,难以在不同的天气状态间混合。天空盒更像是一个背景板。而体积云能参与到世界交互中,且能用云的覆盖水平反映天气情况。
体积云的渲染过程首先是用映射到半球的卷云贴图渲染出地平线附近的云。然后使用天气贴图(Weather Map)构建出平面上的云形态,用不同天气贴图的插值反映不同的云覆盖水平。它在游戏世界中平铺,可以根据风来滚动。接下来用一个简单的渐变贴图打薄云的边缘,再根据base,detail和curl噪声贴图逐渐增加云呈现出来的细节。

体积云效果, 从左往右分别是Cirrus, Weather Map, Gradient, Base, Detail, Curl Noise.

体积雾


体积雾处理过程,其中前三步准备好场景深度信息并对雾的体素做剔除
上图中,填充阶段用辐照度填充体素单元。在这里会使用全局和局部的雾参数、阳光、大气、间接光和其他光源进行计算,使用的相位函数与体积云相同,其中被阴影覆盖的地方不计算阳光的散射。结果使用时间过滤而不是直接做双边模糊,为此需要时间重投影、随时间减小的历史数据。这要求更多的内存占用,有时也会产生诡异的画面表现,但是是一个相对不错的方案。
上面直接使用阴影贴图会导致体积光不自然,双边模糊在这方面效果有限。为此游戏中对阴影贴图做了指数模糊:对转换后的级联阴影贴图重复做采样和模糊,最终得到很小的阴影贴图,这提高了体素采样效率。模糊过的阴影贴图也可以被复用在延迟渲染、水下体积光计算,节省许多时间。

最终的大气、云、雾效果

立方体贴图

屏幕空间反射(SSR)的局限性是不能反映出不在屏幕中的物体,为此开发团队在没有屏幕空间信息的地方使用了立方体贴图映照出天空、云、日落等。立方体贴图是事先烘焙好的,由美术决定使用的位置。在运行时先只渲染包括大气散射、云和雾的立方体贴图,然后使用烘焙的立方体贴图对场景做光线组合,再合成天空和场景光照的立方体贴图。为了节省性能开销,每帧只进行其中一个面的光照计算。针对硬表面的反射,还需要对立方体贴图做模糊处理。

Cubemap Relighting

GPU粒子系统

可以用粒子系统来实现雨的效果。不管是使用广告牌还是几何方法渲染粒子系统,都需要保证正确的粒子排序。
下雨时需要雨线粒子效果,让雨线在围绕玩家的一个圆柱体上周期性旋转,这样不论相机移动多快都能使得雨线的粒子总量保持不变。为了让雨线在它们的生命周期中持续地变化,使用了一张映射到世界空间的三维噪声贴图来实现受气流影响的效果。另外,还用Weather Manager提供的雨和风属性来控制雨线的自发光比率和方向。

雨线粒子效果

游戏中有许多可以被挡雨的区域,为此使用一张阴影贴图来做剔除,覆盖摄像机附近区域,阴影投射的方向与雨平行。将此阴影保存在常规阳光阴影图集,再用一个颜色表将贴图映射到图集。这张雨的阴影贴图只包含静态场景元素,每帧只更新一部分。
另一个粒子效果是雨水碰到表面时的飞溅,同样由GPU驱动,粒子碰到表面时产生新的粒子,利用坡度参数来避免侧面的飞溅。由于不是所有进行碰撞检测的粒子都会产生新的粒子,飞溅效果看起来比较弱,因而在相机周围体积中产生更多粒子并写入深度缓冲。

海 洋

海洋最能体现热带主题。海洋受风向和风级影响,为了表现波浪需要做曲面细分。开发团队采用了新的细分曲面方案。这是一种渐进细化算法,每帧把接近摄像机的网格细分,把远离摄像机的网格合并。
为了仿真海洋波浪,每帧生成一下波浪缓冲。在主要屏幕空间用分形布朗运动(FBM)来模拟靠近相机处的波纹细节。开发人员调整了原来的实现来响应风级的变化,并在纹理中增加一个通道来制作水波尖端的白色效果。
开发团队选用了Gerstner波浪公式程序化生成海岸线附近的波浪。波浪视觉效果由幅度、速度、泡沫等参数控制;还加入了噪声以破坏波前的平行性,否则会产生周期性涌向海岸的规则波纹。

波浪仿真

波浪仿真效果

树木弯屈

风的方向和强度也会让树弯屈。美术给树做骨骼绑定时设置噪声幅度和弯度来提升树木弯屈效果。这些参数让树木在风暴天气有夸张的视觉效果。如果树弯得超出自身包围盒,可能会发生一部分模型突然被裁减的情况,为此开发人员引入了允许增大包围盒的设置。不过这个特性还是比较受限,因为包围盒的扩大会影响性能,而且没有处理远景贴图的树。
05.  总  结

本次演讲中,两位技术人员分享了《孤岛惊魂6》中的天气系统实现细节,对一些湿度效果的实现方式做了详细的解释。为了实现沉浸式的天气效果需要考虑游戏中各方面的画面表现,引入多种图形渲染技术,对一些特定的需求还有需要考虑的细节。他们的实现方式倾向于使用大量程序化生成的贴图来达到预期效果。从他们的演讲中开发者们可以获得实现完整天气系统的宝贵经验。




GDC2022雷火UX演讲一览


【实录】条条大路通罗马:在《永劫无间》中用不同学科方法分析流失

【实录】关注特殊:让颜色不再成为认知障碍
【实录】《逆水寒》的艺术实践:舞蹈与游戏间的细语
【实录】UX助力精益运营:来自《流星群侠传》的经验
【实录】《永劫无间》的UX设计:从原型到成品
【实录】如何早期评估是否是“好产品”:经验教训与最佳实践
【实录】录音艺术与工程实践:《天谕》中的乐器社交
【实录】《永劫无间》:构建一个受欢迎的自定义捏脸系统
【实录】观察变化:含时社交网络可视化与社区行为模式分析
【实录】多人在线游戏中的实时异常监测
【实录】助力游戏策划分析:如何开发一个在线透视图表工具
【实录】图灵模式和分形:程序化生成研究
【实录】游戏中的发型艺术:东西方玩家审美及制作
【实录】自动化实践:随机游戏内容生成指南

【实录】基于多模态模型的游戏帧率预测

预告】东方叙事:如何理解中国游戏中的“武侠”
往期文章:

 IP拓展——《部落冲突》IP宇宙案例研究

 在日本是大作,在欧美却不然:游戏跨文化吸引有多难
 游戏无障碍设计应该优先考虑什么?
 实证研究:如何在游戏中使用皮肤电技术
 文字和情感起伏的呈现:《失落之语》中的叙事设计

《死亡循环》用户研究历程复盘

 文字和情感起伏的呈现:《失落之语》中的叙事设计
 如何让游戏社区保持活跃?
 如何研究玩家的积极行为

 社区互动如何改进《无畏》的游戏设计

 让玩家打破故事进程:沉浸式模拟游戏的叙事设计
 时间循环如何影响《死亡循环》的叙事设计
《地平线:西之绝境》世界中的部落设计
 不要错过通行证:免费游戏最好的商业化设计

 内部实践社区对于育碧的关键作用


 推荐阅读 

本文来自微信公众号“网易雷火UX用户体验中心”(ID:LeihuoUX)。大作社经授权转载,该文观点仅代表作者本人,大作社平台仅提供信息存储空间服务。