感谢在野大佬提供的gdc大会的全套ppt

2022年3月,游戏开发者大会(GDC)于旧金山召开。育碧公司在大会上分享了如何在《孤岛惊魂6(FarCry6,或简称FC6)》当中制作一套完善的天气系统,并适应场景。由于本PPT有大量干货,故本人分为多次进行摘编、翻译。如有不准之处,欢迎在评论区指正。

欢迎来到雅拉!这个加勒比的热带天堂将会给予玩家最真实的体验。
为了做到这一点,我们需要一套真实的天气系统用于模拟,并且还要做到美术团队的需求:
- 动态天气
- 自然过渡
- 高效
- 一个开放世界的游戏建立一个天气系统
为了实现上述要求,FC6的TA团队设计了一套完善的天气管理器(weather manager)。

这个流程图说明了最终的操作顺序。
FC6团队先配置了五天的天气数据,用于循环。游戏运行时,首先查阅天气预报,以获得当前时间的天气预设。
然后根据玩家所在的位置,应用区域调整机制,得到当前的天气状态。这个状态可以在游戏运行时重写,以保证根据具体需求动态调整。顺带一提,FC6团队对于区域的判定延伸到更小的区域,如室内、洞穴以及美术可能需要定义的任何其他场景。
最后,使用这个天气状态来更新湿润度、雨水和闪电的时间,并输出最终参数。这些参数都是变量,如湿度系数、雨量系数等。游戏程序在运行时,可以访问这些变量来表现最合适的视觉效果、音频效果和游戏性等等。

如何根据玩家在世界中移动的位置来改变天气?
对于每个区域,FC6的TA们暴露了最小和最大的曲线来限制某些天气属性。
一个使用案例是他们将室内区域的最大雾气曲线设置为0,以防止雾出现在室内。这样做的限制是如果当前室内区域有可以看到外界的窗户,玩家一走进来,会看到外面的雾气消失。因此不管是策划还是美术都要注意,有窗户的室内场景的摆放与设置,防止穿帮。
天气管理器将玩家周围所有可能重叠的区域纳入其中,并把相应曲线进行相应的插值,以输出调整后的天气。

为了响应天气系统,物体材质也应当做出相应的表现。例如下小雨时,物体应当有一点点润湿的感觉;下大雨时,地面上应该有深浅不一的水坑等等。如果想实现这样的效果,意味着:
每个asset都需要一个潮湿的状态,这样才能在干燥状态和潮湿状态之间进行混合。
这么做必然会存在问题:
1. 有太多的asset(因为需要额外的润湿数据),极大增加工期。
2. 美术团队都有自己的管线和着色器,在实际开发时会使用各自的环境进行操作。鉴于FC6的规模,很难保证不出现冲突。
对此,FC6的TA团队的解决方案是并行工作流程:每制作一个材质时,必须有润湿和干燥两种状态。为了做到这一点,流程需要尽可能的简单和统一。为了规避风险,这套流程主要由TA驱动,做到 "开箱即用"(即:在软件上指产品在安装后,无需配置或修改,即可使用的功能或特性。也指默认即对所有用户可用,不需支付额外费用或进行另外的配置。)。
实现这套流程,意味着在布置场景时,我们能够在世界中拖放asset,而且这些asset应该在雨中变湿。当然,有些asset会得到更多的细节和抛光,但对于最简单的物体来说,只要按照这套流程走下来,就不必要再过多的检查或配置了。

在游戏中,物体类型通常分为静态物体(不会移动)与动态物体(会移动)。首先我们看看相对简单的静态物体润湿。
静态湿润主要适用于已经用Object Bank模式(注:该模式一种基于物体的高层语义图像特征表示,所提取的高层特征具有较丰富的场景语义)存储的assets,包括物件和建筑物。
湿润程度是通过使用天气管理器提供的湿润因子参数来确定的。我们还使用湿润阴影图来掩盖适当的湿润度。
静态湿润在视觉上是最简单的,它将被应用在延迟照明过程中,这意味着它将被应用在一个地方。静态湿润的优点简单,所有的东西都可以一次性调整,缺点是不够灵活。

静态物体的湿润需要计算的主要湿润度是湿润度阴影贴图,它遮盖了例如在阳台下或在室内的物体。这一点很重要,因为我们会重复使用我们的道具,所以无论它们被放在哪里,它们的湿润度都应该是准确的。
由于我们的静态湿润度是在延迟照明通道中应用的,所以我们将湿润度阴影存储在延迟阴影通道中。然后我们将采样的阴影与天气管理器的WetnessFactor相乘,得到最终的湿度。


在参考了相关资料后,FC6团队确定需要的两个视觉变化参数为反照率和平滑度。
一些材料如纸板会变暗,但不会变得太闪亮。像瓷砖这样的材料不会变黑,但会变得更有光泽。有些材料则介于两者之间。所有这些的关键是材料的吸收性如何。而描述材料吸收性的参数,称为孔隙度。
孔隙度与反照率的变化有最直接的关系。

高孔隙度的材料,如泥土、织物和原木,会变得饱和,显得非常黑暗。
低孔隙度的材料如塑料、大理石和金属会在其表面积水,而不是被吸收,这意味着它们的颜色应该是不变的。
有了材质贴图,再叠加孔隙度贴图,即可进行下一步工作了。但是这样做有一个问题:不是所有材质都能负担的起一张额外贴图的开销。
因此,我们需要一种方法,在没有孔隙度纹理的情况下推导出孔隙度。
由于孔隙度和平滑度是概念上相关的属性,因此可推出以下公式:
Porosity = PorosityFactors.x * smoothness + PorosityFactors.y

其中两个孔隙度因子值是浮动的,我们可以为每个材料类型指定。这个公式基本上生成了一个具有平滑度图的所有细节的孔隙度图,但其值位于我们设定的范围内。
最后,将这个参数在不破坏原有结构的条件下,暴露到pbr材质配置中,让美术人员填写配置即可。

对于输入很少的近似值,我们不可能使每个材质球响应正确。更重要的是判断全局,而不是单个asset。这帮助我们避免了无休止的值调整循环。

