Unity 2022 LTS 和 2023.1 中的新水系统

大多数高端环境在某些时候都需要海洋、湖泊、河流,甚至只是一个游泳池。有很多方法可以使用一些着色器来模拟这些,但是在高清渲染管线 (HDRP) 中构建整个基于物理的、连贯集成的系统是一项复杂且耗时的任务。
今天,我们重点关注新的 Unity 水系统,该系统作为 2022.2 技术流的一部分首次在 HDRP 中推出,重点是渲染。即将推出的 2023.1 Tech Stream 扩展了系统的功能集,以便更好地与世界和游戏玩法相结合。
环境艺术家现在可以轻松创建和配置水面(例如海洋、湖泊、河流和水池),并将其与其他世界和游戏元素(例如船只或海边)相结合。
第一步是在您的项目中激活水:
- 激活并配置每个质量级别的水(为每个质量级别渲染管道资产)
- 在相机的框架设置中激活水
- 使用水渲染体积覆盖激活场景中的水,这允许您根据相机的位置仅在需要时启用水渲染
一旦水被激活,您只需从 GameObject 菜单单击几下即可创建美丽的水体。HDRP 提供三种水面类型:水池、河流和海洋。


创建水体很快,但水系统提供了许多工具和选项来定制水并将其与您的世界和游戏玩法相结合。
要快速了解所有系统和扩展的实际运行情况,请查看 HDRP 包中的水样(打开包管理器 > 选择资产中的高清渲染管线包 > 选择样本部分内的水样)。
我们提供了四个示例场景。
游泳池 场景展示了如何在同一场景中以不同的高度设置不同的“水池”,以及如何使用自定义网格渲染具有自定义形状的表面。
岛屿 场景展示了海洋主体,包括一个用于消除岛屿周围波浪的防水罩、一个用于产生波浪的水变形器、一个用于在海滩上放置泡沫的贴花、一个用于在波浪后方和岛屿周围产生泡沫的泡沫发生器,以及一个用于排除船内水的防水器。它还专注于利用 Burst 和水查询 API 来并行计算多个物体(即海鸥)漂浮在水面上。
冰川 场景展示了许多特征,其中包括:
- 河流水体
- 使用水变形器创建瀑布
- 当前模拟使水流过冰川
- 让冰山顺流而下的水资源查询 API
- 泡沫发生器在冰山后面添加泡沫
- 使用 Shader Graph 和 Water 主节点在河流边界和瀑布漩涡上自定义泡沫
- 瀑布水落下的动画贴花
- 将焦散线样本投射到水外
水线 场景展示了使用自定义通道定制水面水平和水下渲染,产生更大的模糊分离并模拟水对相机镜头的影响。
现在您已经充分了解了情况,让我们深入了解每个系统。
水系统配备了一个现成的、基于物理的水着色器,它是根据 HDRP 中最近引入的照明模型设计的,也可用于 Shader Graph 进行自定义。您可以调整水面的平滑度、折射、吸收、扩散和光散射特性。
散射颜色的作用类似于水的基色,因此您需要从那里开始设置总体感觉。然后,您可以改变吸收距离和折射颜色,以控制水的透明度以及通过水折射看到的物体的色调。对于干净的加勒比海,您需要较大的吸收距离以及青色的散射和折射颜色,而对于肮脏的河流,您需要深棕色的散射颜色和吸收距离较小的准不透明河流。
2022.2 中的水渲染存在局限性,其中一些问题已在 2023.1 中得到解决(看到体积云后面的水、精确的水线)或将在 2023.2 中得到解决(性能改进、支持渲染与水重叠的透明表面)。
如果您像我们一样是 库斯托指挥官的粉丝,您一定会喜欢使用水系统潜水。它可以检测相机何时位于水面以下,并根据水的物理特性模拟水下渲染。
可以程序化生成焦散来模拟从表面投射到地面的光折射。请注意,焦散可以重新用作水外的投影,例如,使用贴花来模拟洞穴内反射的水焦散。
当相机位于水与外部之间时,就会产生一条水线,水下渲染是在相机浸没的部分上进行的。2023.1 中改进了水线渲染,允许您使用自定义通道对其进行自定义(参见:水线示例场景)。
水的流动方式使得它看起来更加具有视觉吸引力。请注意,所提供的水模拟系统侧重于水面变形而不是流体或飞溅模拟。
这些波是使用快速傅里叶变换 (FFT) 模拟程序生成的。简单地说,它的工作原理是将许多不同频率的简单波相加来形成复杂波。通过控制频率范围,您可以控制水的搅动。
该系统通过添加各种频率范围(我们称之为波段)来工作。

HDRP 最多支持三个波段,可模拟现实世界对水的三种效果,并涵盖大多数用例:
- 涌浪,代表受月亮和远处风的影响而产生的波浪。它完全由距离风参数控制,并允许您调整海浪的方向。
- 躁动,代表着风产生的混乱。
- 涟漪,代表洋流或局部风的影响。这是频率最高或波浪最小的波段,为水添加了精细的细节。

例如,由于池的扰动较小,因此它们仅使用最高频带:涟漪。河流稍微复杂一些,会有涟漪和激流带。海洋具有全频率范围,能够覆盖我们在现实生活中看到的所有各种波浪尺寸。模拟在方形面片上进行,然后无限重复。
在 2023.1 中,我们增加了对电流的支持,电流将使涟漪根据流程图流动。模拟是完全确定性的,因此在进行多人游戏、物理模拟或录制短片或电影时可以获得一致的结果。
为了渲染水面变形,系统使用顶点位移,并且可以应用于提供的程序生成的几何体或您提供的自定义网格。程序几何通过实例化彼此相邻的四边形来工作,类似于地形的渲染方式。这也可以用于创建无限的海洋或长河,以确保顶点密度适应相机的位置。
除此之外,为了获得更精细的顶点密度来渲染小涟漪,HDRP 可以依赖 GPU 曲面细分,这是一种使用特殊着色器细分三角形的方法。有了这种功能,当相机距离水面有一定距离时,您可以看到在视点附近生成了更多的三角形。
系统还提供各种选项来平衡视觉质量和渲染性能。在我们的 文档中了解有关优化性能的更多信息。
泡沫模拟了风在波峰时、海浪拍打海岸或岩石时、或在水中移动的船或人物在水上或水下产生的气泡。
水系统可以根据水体模拟和河流和海洋的距离风速自动生成泡沫。然后,您可以调整泡沫的数量并调整外观,选择其光滑度和纹理的平铺。

对于 2023.1,添加了 泡沫生成器 来模拟船道、波浪或开阔水域中岩石周围的白水,以便可以产生泡沫并根据波浪继续其自身的路线。在示例场景中,您将看到泡沫生成器的不同使用示例:在岛屿场景中,它用于在破浪的顶部和岛屿周围产生泡沫,在冰川场景中,它用于在河流中漂浮的冰山后面产生泡沫。

使用 Shader Graph,您可以将自定义泡沫注入 Water 主节点,并使用它来为河流边界或瀑布漩涡等添加自定义程序泡沫。例如,在 Glacier 示例中,瀑布底部的漩涡是通过在 Shader Graph 中简单滚动和混合自定义泡沫纹理来完成的。边界上的泡沫是通过对深度缓冲区进行采样来近似深度而制成的。

在波浪搅动需要的地方将会注入模拟泡沫。但出于艺术目的,您可能需要使用泡沫面罩遮住一些区域以避免接收泡沫。
为了看起来更逼真,需要对水面和模拟进行局部修改,以便更好地与您的世界和道具融合。比如,为了去除船内的水几何形状,可以在海浪冲击下的海边靠近岸边添加碎浪,在岩石周围产生泡沫,改变局部水流,在海湾内塑造平静区域,在河中间创建瀑布,或者在河中产生小漩涡或在海洋中间产生巨大的涡流。
多个组件允许您自定义模拟、泡沫和电流,以创建这些局部变化或更复杂的效果:
- 水膜 可以减弱或抑制水面特定部分的涟漪、涌浪和泡沫。
- 可以在水面上添加贴花 来创建局部泡沫,覆盖水的平滑度,或者通过使用法线贴图来模拟小的局部变形,例如水滴,撞击或自定义涟漪。它们还可以用于独立于水系统模拟沙子或岩石上的湿度(参见:岛屿示例场景)或墙壁上的焦散(参见:冰川示例场景)。请注意,由于贴花仅被视为灰度,因此颜色无法改变。
- 水变形器 可以局部修改模拟以创建波浪,如岛屿样本中展示的那样,或瀑布,如冰川样本中所示。
我们测量了冰川场景的性能,其中大多数功能在各种控制台上都已激活,并在此基础上对水系统进行了分析。通过测量,我们了解到最新一代的 GPU 上的水渲染时间大约需要 4ms,而前几代游戏机的 GPU 上水的渲染时间大约需要 7ms。当然,这在很大程度上取决于水的质量设置、模拟的复杂性以及屏幕上显示的水像素数量。但该系统性能足够好,可以在各种平台上顺利运行。
此外,该系统使用延迟集群照明来优化阴影并支持大量光源。大部分渲染时间来自 GBuffer 通道,因为即使在远处也需要大量顶点才能获得漂亮的波浪。当在表面启用 GPU 曲面细分时,可以通过改变最大曲面细分级别和摄像机远离水时的淡入距离来控制此成本。
在每个水面的杂项部分,您可以使用各种调试模式来可视化水流方向、变形、泡沫和应用于水面的其他蒙版。

为了查看水系统在更复杂的场景中的运行,我们创建了一个展示泳池、岛屿和河流场景的演示项目。

岛屿场景展示了一望无际的海洋和海浪冲击海滩的景象。它展示了如何使用水罩并使用自定义渲染纹理制作变形器和泡沫生成器。当海浪接近海滩时,它还会使用贴花与水面产生复杂的互动。
泳池场景展示了具有逼真的色彩、深度、水下和焦散的室内水面。

河流场景展示了实例四边形的使用,并利用当前地图来模拟流动,以及贴花、自定义 Shader Graph 和 VFX Graph 来增强视觉效果。
您可以在 GitHub 上 下载 演示。
要使用水系统,您必须使用 HDRP 和 Unity 2022.2 或更高版本。
虽然您可以使用 2022.2 中的一些初始功能,但我们建议从 2023.1 开始,其中添加了多项改进和功能,包括一些 API 更改。
您可以在包管理器中下载水样,然后开始重复使用示例代码和系统。另外,请查看我们在 GitHub 上的 WaterScenes 演示项目,了解水系统集成在一起的更复杂的示例。
要了解更多信息,请观看 Rémi 和 Adrien在 GDC 2023 上对水系统进行的深入探讨 ,或阅读我们的 文档。