构建物理真实的水体系统向来是一项复杂且耗时的任务,Unity 早在 Unity 2022.2 Tech Stream 中就推出了 Unity Water System 解决方案,在最新发布的 2023.1 Tech Stream 中,我们进一步扩展了水系统功能集,使其能更好地与世界和游戏过程整合。
本文将从使用方法、Unity Water System 技术原理、相关官方资源等方面为大家简要介绍。
更多关于 Unity Water System 的具体内容请在文档中了解:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@16.0/manual/WaterSystem-use.html
▎ 第一步!启用水效果:
- 为每一级质量(每一级渲染管线配置文件)启用和配置水效果
- 在摄像机的帧设定(Frame Settings)里启用水效果
- 在场景内用 Water Rendering 体积覆盖启用水效果,可以根据相机的位置在需要时启用水渲染。
启用水效果后,只需在 Game Object 菜单里点击几下就能创建漂亮的水体了。HDRP 提供了三种水面类型:泳池、河流和海洋。
*要使用该水系统,须使用 HDRP 和 Unity 2022.2 及以上版本。
*因为在 2022.2 版本中只包括了一些初始功能,所以更推荐直接从 2023.1 Tech Stream 开始,新版本增添了多项功能和改进,部分 API 也经过了修改。
▎ 用水样例场景快速上手
除了可以快速创建水体,Water System 也带有许多工具和选项,可用于自定义效果。要想快速了解所有系统和扩展功能的实际使用,请查看 HDRP 软件包内的水样例场景:
获取方式:打开 Package Manager > 选中列表里的 High Definition Render Pipeline 包 > 在 Samples 一栏中选择 Water Samples。
泳池(Pool)场景展示了如何在同一场景里设置不同高度的泳池,以及如何用自定义网格渲染带自定义形状的水面。
岛屿(Island)场景展示了海洋水体,包含了一个可以消除岛屿四周涌浪的水遮罩,可以形成波浪的水变形器,可为海滩加上泡沫的贴花,可在波浪后方及岛屿周围生成泡沫的泡沫生成器,以及可在船体内去除水的水排除器。
该场景还侧重于用 Burst 和水查询 API 来并行计算多个对象(如多只海鸥)的水面漂浮效果。
冰川(Glacier)场景展示了许多功能,包括:河流水体、用于创建瀑布的水变形器、水流流过冰川的流体模拟、使冰山随河流漂流的水查询 API、在冰山后方加上泡沫的泡沫生成器、用 Shader Graph 和 Water 主节点为河流边缘和瀑布漩涡添加自定义泡沫、形成水流落入瀑布动画的贴花和投射到水面外部的样例焦散效果。
水际线(Waterline)场景展示了用自定义通道定制水面水平与水下渲染,产生更大的模糊分离效果,模拟水对摄像机镜头的影响。
▎ 基于物理的水体渲染
Water System 提供了现成的、基于物理的水着色器,它根据 HDRP 最新推出的光照模型设计,还可用 Shader Graph 进行定制,能调整水面的平缓度、折射、吸收、漫射和光散射等属性。
散射颜色的作用类似于水的基础色,所以可以从这里开始设置水的整体观感。然后可以修改吸收距离和折射颜色,控制水的透明度以及物体经水折射出的颜色。
如果是清澈的加勒比海,吸收距离可以更大,散射与折射颜色可以是青色;如果是污浊的河流,可能要用深褐色的散射颜色及更小的吸收距离来形成一条几乎不透明的河流。
2022.2 版本的水体渲染存在着一些限制,部分在 2023.1 版本已经得到解决(比如穿过体积云看到后方的水体、更精确的水际线),2023.2 版本将有更好的性能,并支持渲染与水体重叠的透明表面。
▎ 水面之下
如果你也是 Jacques-Yves Cousteau(纪录片《寂静的世界》导演之一)的粉丝,那么你肯定会喜欢 Water System 的水底效果!系统可以检测摄像机是否处于水面下方,并根据水的物理性质模拟水下画面。
程序化生成的焦散效果可以模拟光线从投射在地面上的(水)表面上折射的效果。焦散效果能作为水面外部的投影使用,比如当作贴花来模拟水体焦散在洞穴内部的反射。
当摄像机处于水中与水上之间时,镜头内就会产生水际线,摄像机浸入水中的部分会有水下渲染效果。2023.1 更是改进了水际线渲染,允许使用自定义通道进行定制。
▎ 涌浪、搅动、涟漪和水流
波浪是用快速傅里叶变换(FFT)模拟程序化生成而来。简单来说,它的原理是把多种不同频率的简单波浪叠加起来,形成复杂的波浪效果。通过控制频率范围,可以控制水的扰动程度。
水模拟系统更侧重于水平面的变形,而不是流体或溅泼模拟。该系统通过将不同频率范围的波动相加来进行模拟,可将这些频率范围称为"波段"。HDRP 支持最多三个波段,模拟了真实世界对水的三种影响,可满足大多数用例:
涌浪代表了月亮与远处风产生的波浪效果。它仅由远处风的参数控制,可以指定浪的方向。
扰动代表风所产生的混乱运动。
涟漪代表水流或小范围风的效果。这是频率最高或波浪最小的波段,可为水面增添精细的细节。
比如,泳池的扰动很小,只会有频率最高的涟漪波段。更复杂的河流会有涟漪和扰动波段。而海洋则拥有全部三种频率范围,覆盖现实中看到的各类大小波浪。模拟以一块立方体积为基本单位,向四周无限重复。
在 2023.1 里会支持水流,让涟漪随着流动贴图流动。该模拟具备绝对的确定性,在多人游戏、物理模拟或录制短片或电影时都能产生一致的结果。
▎ 大规模精确渲染
为了渲染水平面的形变,系统采用了顶点偏移(vertex displacement),偏移结果可应用在程序生成的几何形或网格上。这些几何形的程序化生成方法是在相邻位置实例化四边形,类似于地形的渲染。同样的方法也能用在无限的海洋或超长的河流上,来保证顶点的密度可随摄像机位置而改变。
此外,为了在渲染小涟漪时拥有更细的顶点密度,HDRP 可以依靠 GPU 细分(Tessellation),借助特殊着色器进一步划分三角形。有了该功能后,每当摄像机进入一定距离范围,就能在视线近处看到更精细的波澜涟漪。
▎ 模拟采样
为了提高效率,模拟会由 GPU 全权负责,但部分模拟可以复制到 CPU 上,以便对水的高度和水流进行采样,做出物体顺着河流漂浮等效果。
这会产生不少 CPU 开销,因为模拟需要执行大量计算,但这一开销能借助使用 Burst 编译器编译的 jobs 来进行高效的并行运算,从而维持在一个合理的范围内。
*根据用户反馈,2022.2 与 2023.1 间的编程 API 已经有了变化,代码可能需要进行调整。
要进行采样,可找到场景内的两份代码样例:岛屿场景的代码可利用 Burst 来并行采样多个物体;冰川场景的代码更简单,没有并行代码,它展示了让冰块沿着河流漂浮并落入瀑布。
▎ 泡沫
泡沫模拟的水面或水下气泡或由风吹向浪尖产生,或由浪拍打在海岸及岩石上产生,或由船只及人物的水中运动产生。
Water System 可以根据水体模拟与远处风的风速自动给河流与海洋生成泡沫。它还允许调整泡沫的数量和外观,选择其平滑度和纹理的平铺方式。
2023.1 新增了泡沫生成器(Foam Generator),用于模拟船舶航行、波浪或开阔水域的岩石周围的白色水沫,让泡沫能在生成后随着波浪自行流动。在样例场景里会看到泡沫生成器的两种用法:岛屿场景用它生成浪尖和岛屿周围的泡沫;冰川场景用它生成河上漂流的冰山后方的泡沫。
利用 Shader Graph,可以把自定义泡沫接到 Water 主节点,给河水边或瀑布漩涡加上自定义的程序生成泡沫。在冰川场景里,瀑布底的漩涡就是用 Shader Graph 滚动并混合自定义泡沫纹理来实现的。边界上的泡沫则是通过采样 Depth Buffer、求得大致深度来制作的。
模拟的泡沫将被生成到波浪搅动需要的地方。但出于美学考虑,可能需要用泡沫遮罩(foam mask)屏蔽掉某些区域,使其免受泡沫影响。
▎ 融入环境
为了让环境看着更逼真,水面和模拟通常要需要局部修改才能更好地与世界及道具结合。比如删去船内的水体几何形,在海岸存在涌浪的一侧加上拍打的浪花,给岩石四周生成泡沫,修改局部水流,营造海湾内的平静水域,在河流中段创建瀑布,或生成河流内的小漩涡及海洋中的巨型漩涡。
可以用多个组件来自定义模拟、泡沫和水流,创造出小范围的水体变化或更复杂的效果:
水遮罩(Water Mask)允许在特定部分的水面上减弱或抑制涟漪、涌浪和泡沫。
贴花(Decal)可以用于制作水面上的小范围泡沫、覆盖水的平滑度,或借助法线贴图模拟小范围变形,如水滴、冲击或自定义涟漪。它们也能独立于水系统模拟出沙滩或岩石上的湿润感(见岛屿场景)或墙壁上的焦散效果(见冰川场景)。
*贴花会被用作灰度图,因此颜色不能修改。
水变形器(Water Deformer)可以修改一小块位置的模拟,来产生岛屿场景的波浪,或冰川场景里的瀑布。
▎ 性能优化
开发团队在多台主机上开启了大部分功能,测试了冰川场景的性能,并分析了 Water System。经过测量发现水的渲染时间在最新一代主机上的 GPU 耗时约为 4 毫秒,而上一代主机需要大约 7 毫秒。当然,这个耗时很大程度上取决于水的质量设置、模拟的复杂性及屏幕上的像素数量。但该系统的性能足以在各类平台上流畅运行。
此外,该系统使用了延迟集群光照(deferred clustered lighting)来优化着色,并支持大量光源。由于远近波浪都需要获取关键的顶点数量,大部分渲染时间其实都花在了 GBuffer 通道上。如果在表面上启用 GPU 细分,可以通过修改最大细分等级和摄像机远处淡出距离来控制这个开销。
在每个水面的 Miscellaneous 界面,可以用各种调试模式来可视化水流方向、变形、泡沫以及其他水面上的遮罩。
▎ 演示项目
为了看到 Water System 运行在更复杂的场景里,我们创建了一个展示泳池、岛屿和河流的演示项目。
岛屿(Island)演示项目包含了一片无边际的海洋,海滩上会形成岸边的波浪。它展示了怎样使用水遮罩、用自定义渲染纹理创建变形器和泡沫生成器。当海浪靠近海滩时,它还会用贴花来形成复杂的水面交互。
泳池(Pool)演示项目展示了一个室内水面,具有逼真的颜色、深度、水底和焦散效果。
河流(River)演示项目展示了实例化四边形的使用,用水流贴图模拟水流,以及贴花、自定义 Shader Graph、增强视觉效果的 VFX Graph。
访问如下链接在 GitHub 上下载这些演示项目:
https://github.com/Unity-Technologies/WaterScenes
除了前往 Package Manager 里下载水样例场景,在 GitHub 上查看新 WaterScenes 演示项目,了解更复杂的水系统整合实例。
也推荐观看 Rémi 和 Adrien 在 GDC 2023 上做的 Water System 深入讲解:
https://www.bilibili.com/video/BV1dP411977G/
本文转自: Unity官方平台,转载此文目的在于传递更多信息,版权归原作者所有。如不支持转载,请联系小编demi@eetrend.com删除。