Unity 2022 LTS与2023.1中的新水系统(Water System)

您所在的位置:网站首页 河流桌多少钱 Unity 2022 LTS与2023.1中的新水系统(Water System)

Unity 2022 LTS与2023.1中的新水系统(Water System)

2023-12-31 22:21| 来源: 网络整理| 查看: 265

精美的游戏环境或多或少都需要一片海洋、湖泊、河流甚至泳池。这些水效果有许多用着色器进行模拟的方法,但在高清渲染管线(HDRP)里构筑一个完全基于物理的一体化水系统向来是一项复杂且耗时的任务。

这里,我们隆重介绍 Unity Water System,这款解决方案首次在Unity 2022.2 Tech Stream的HDRP,作为渲染方面的一项重点被推出。之后的2023.1 Tech Stream进一步扩展了水系统功能集,使其能更好地与世界和游戏过程整合。

轻松创建海洋、湖泊、河流或泳池

环境美术们现在可以轻松创建和配置各类水面,如海洋、湖泊、河流和泳池。水面可以与其他世界及游戏元素(如船只或海滨)相结合。

制作的第一步是为项目启用水效果:

为每一级质量(每一级渲染管线配置文件)启用和配置水效果;

在摄像机的帧设定(Frame Settings)里启用水效果;

在场景内用Water Rendering体积覆盖启用水效果,可以根据相机的位置在需要时启用水渲染。

启用水效果后,你只需在GameObject菜单里点击几下就能创建漂亮的水体了。HDRP提供了三种水面类型:泳池、河流和海洋。

简单几键创建海洋

用水样例项目快速上手

水体的创建可以非常快,Water System带有许多工具和选项,可用于自定义效果,或把水体结合到世界和游戏过程里。

要想快速了解所有系统和扩展功能的实际使用,请查看HDRP软件包内的水样例(打开Package Manager >  选中In Project列表里的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版本解决(更好的性能、支持渲染与水体重叠的透明表面)。

潜入水面

如果你和我们一样是雅克-伊夫·库斯托(Commandant Cousteau,Jacques-Yves Cousteau 的尊称)的粉丝,你肯定会爱上Water System的水底效果的。系统可以检测摄像机是否处于水面下方,并根据水的物理性质模拟水下画面。

程序化生成的焦散效果可以模拟光线从投射在地面上的水表面上折射的效果。注意,焦散效果能作为水面外部的投影使用,比如当作贴花来模拟水体焦散在洞穴内部的反射。

当摄像机处于水中与水上之间时,镜头内就会产生水际线,摄像机浸入水中的部分会有水下渲染效果。2023.1更是改进了水际线渲染,允许你用自定义通道进行定制(请参考:The Water Line样例场景)。

涌浪、搅动、涟漪和水流

水的运动能让水更加吸引人。请注意,我们的水模拟系统更侧重于水平面的变形,而不是流体或溅泼模拟。

模拟参数设置

波浪是用快速傅里叶变换(FFT)模拟程序化生成而来。简单来说,它的原理是把多种不同频率的简单波浪叠加起来,形成复杂的波浪效果。通过控制频率范围,你可以控制水的扰动程度。

该系统通过将不同频率范围的波动相加来进行模拟,我们将这些频率范围称为"波段"。

HDRP支持最多三个波段,模拟了真实世界对水的三种影响,可满足大多数用例:

涌浪,代表了月亮与远处风产生的波浪效果。它仅由远处风的参数控制,可以指定浪的方向;

扰动,代表风所产生的混乱运动;

涟漪,代表水流或小范围风的效果。这是频率最高或波浪最小的波段,可为水面增添精细的细节。

比如,泳池的扰动很小,只会有频率最高的涟漪波段;更复杂的河流会有涟漪和扰动波段;而海洋则拥有全部三种频率范围,覆盖现实中看到的各类大小波浪。模拟以一块立方体积为基本单位,向四周无限重复。

在2023.1里,我们会为水流增加支持,让涟漪随着流动贴图流动。该模拟具备绝对的确定性,在多人游戏、物理模拟或录制短片或电影时都能产生一致的结果。

大规模精确渲染

为了渲染水平面的形变,系统采用了顶点偏移(vertex displacement),偏移结果可应用在程序生成的几何形或你自己的网格上。这些几何形的程序化生成方法是在相邻位置实例化四边形,类似于地形的渲染。同样的方法也能用在无限的海洋或超长的河流上,来保证顶点的密度可随摄像机位置而改变。

此外,为了在渲染小涟漪时拥有更细的顶点密度,HDRP可以依靠GPU细分(Tessellation),借助特殊着色器进一步划分三角形。有了该功能后,每当摄像机进入一定距离范围,你都能在视线近处看到更多的三角形生成。

系统还提供了多种平衡图像质量与渲染性能的选项。更多关于性能优化的内容请在文档中了解:

https://docs.unity3d.com/Packages/[email protected]/manual/WaterSystem-QualityPerformance.html

模拟采样

正如刚刚解释的,为了提高效率,模拟会由GPU全权负责,但部分模拟可以复制到CPU上,以便对水的高度和水流进行采样(做出物体顺着河流漂浮等效果)。

这会产生不少CPU开销,因为模拟需要执行大量计算,但这一开销能借助使用Burst编译器编译的jobs来进行高效的并行运算,从而维持在一个合理的范围内。

注意,根据用户反馈,2022.2与2023.1间的编程API已经有了变化,你的代码可能需要进行调整。

要进行采样,你可以找到场景内的两份代码样例:Island场景的代码可利用Burst来并行采样多个物体,Glacier场景的代码更简单,没有并行代码,它展示了让冰块沿着河流漂浮并落入瀑布。

泡沫

泡沫模拟的水面及水下气泡,或由风吹向浪尖产生,或由浪拍在海岸及岩石上产生,或由船只及人物的水中运动产生。

Water System可以根据水体模拟与远处风的风速自动给河流与海洋生成泡沫。它还允许调整泡沫的数量和外观,选择其平滑度和纹理的平铺方式。

2023.1新增了泡沫生成器(Foam Generator),用于模拟船舶航行、波浪或开阔水域的岩石周围的白色水沫,让泡沫能在生成后随着波浪自行流动。在样例场景里,你会看到泡沫生成器的两种用法:Island场景用它生成浪尖和岛屿周围的泡沫;Glacier场景用它生成河上漂流的冰山后方的泡沫。

利用Shader Graph,你可以把自定义泡沫接到Water主节点,给河水边或瀑布漩涡加上自定义的程序生成泡沫。在Glacier样例里,瀑布底的漩涡就是用Shader Graph滚动并混合自定义泡沫纹理来实现的。边界上的泡沫则是通过采样Depth Buffer、求得大致深度来制作的。

模拟的泡沫将被注入到波浪搅动需要的地方。但出于美学考虑,你可能需要用泡沫遮罩(foam mask)屏蔽掉某些区域,使其免受泡沫影响。

与世界相结合

为了让环境看着更逼真,水面和模拟通常需要局部修改才能更好地与世界及道具结合。比如删去船内的水体几何形,在海岸存在涌浪的一侧加上拍浪,给岩石四周生成泡沫,修改局部水流,营造海湾内的平静水域,在河流中段创建瀑布,或生成河流内的小漩涡及海洋中的巨型漩涡。

你可以用多个组件来自定义模拟、泡沫和水流,创造出小范围的水体变化或更复杂的效果:

水遮罩(Water Mask)允许在特定部分的水面上减弱或抑制涟漪、涌浪和泡沫。

贴花(Decal)可以用于制作水面上的小范围泡沫、覆盖水的平滑度,或借助法线贴图模拟小范围变形,如水滴、冲击或自定义涟漪。它们也能独立于水系统模拟出沙滩或岩石上的湿润感(见Island样例场景)或墙壁上的焦散效果(见Glacier样例场景)。注意,贴花会被用作灰度图,因此颜色不能修改。

水变形器(Water Deformer)可以修改一小块位置的模拟,来产生Island样例里的波浪或Glacier样例里的瀑布。

性能与调试

我们在多主机上开启了大部分功能,测试了Glacier场景的性能,并分析了Water System。经过测量,我们发现水的渲染时间在最新一代主机上的GPU耗时约为4毫秒,而上一代主机需要大约7毫秒。当然,这个耗时很大程度上取决于水的质量设置、模拟的复杂性及屏幕上的像素数量。但该系统的性能足以在各类平台上流畅运行。

此外,该系统使用了延迟集群光照(deferred clustered lighting)来优化着色,并支持大量光源。由于远近波浪都需要获取关键的顶点数量,大部分渲染时间其实都花在了GBuffer通道上。如果在表面上启用GPU细分,我们可以通过修改最大细分等级和摄像机远处淡出距离来控制这个开销。

在每个水面的Miscellaneous(杂项)部分,你可以用各种调试模式来可视化水流方向、变形、泡沫以及其他水面上的遮罩。

水体 Demo

为了呈现Water System在更复杂场景里的运行,我们创建了一个展示泳池、岛屿和河流的演示项目。

Island场景包含了一片无边际的海洋,海滩上会形成岸边的波浪。它展示了怎样使用水遮罩、用自定义渲染纹理创建变形器和泡沫生成器。当海浪靠近海滩时,它还会用贴花来形成复杂的水面交互。

Pool场景展示了一个室内水面,具有逼真的颜色、深度、水底和焦散效果。

River场景展示了实例化四边形的使用,用水流贴图模拟水流,以及贴花、自定义Shader Graph、增强视觉效果的VFX Graph。

可以在GitHub上下载这些demo:

https://github.com/Unity-Technologies/WaterScenes

如何开始

要使用水系统,你必须使用HDRP和Unity 2022.2及以上版本。2022.2只包括了一些初级功能,我们推荐从2023.1开始,新版本增添了多项功能和改进,部分API也经过了修改。

如上文所述,可以在Package Manager里下载水样例场景,把代码和系统用到自己的项目中。此外,也能在GitHub上看看我们的WaterScenes demo,了解更复杂的水系统整合实例。

更多信息,请观看Rémi和Adrien在GDC 2023上做的Water System深入讲解:

或前往文档了解:

https://docs.unity3d.com/Packages/[email protected]/manual/WaterSystem.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3