水网格体系统及表面渲染

介绍虚幻引擎中如何渲染水体的表面和网格体。

Windows
MacOS
Linux

水系统由两个关键元素构成:可编辑的水面和水面材质。这两个元素确定了项目中的水如何表现,以及与所接触对象互动。这可以是非常简单,比如水材质如何将光反射和折射到与水面接触的对象上。对于Gameplay,这可以是角色在水中移动时如何让水面产生波浪,或者对象在水面上漂浮时的浮力有多大。

水面网格体

水系统有自己的基于样条线的网格体系统,可定义世界内应该包含水的区域。它使用 水网格体Actor(Water Mesh Actor),设置应用于关卡中放入的所有 水体Actor(Water Body Actors)(江河、湖泊和海洋)的属性。水网格体主要定义了所渲染水面的质量和细节。

你必须将水网格体Actor放入场景中,以生成关卡中"水体(Water Body)"类型的表面。水网格体Actor本身并不会渲染表面。水体将使用样条线来定义关卡中表示江湖、湖泊和海洋的区域。这些样条线定义了水网格体Actor在何处绘制并渲染水网格体图块。这样做更高效,因为它仅渲染当前摄像机视图中可见的表面网格体。

水网格体Actor位于场景中时,将水体拖放到场景中可添加或移除表示水面的图块。由于所有水体使用相同的网格体来渲染水面,因此它们会无缝地混合在一起(见下)。这还意味着,你可以在不同类型的水面之间进行过渡,如从奔流的江河汇入平静的湖泊或汹涌的海洋。

使用控制台命令 r.Water.WaterMesh.ShowWireframe 1 启用水网格体线框视图,以查看不同水体之间的这些过渡如何相互作用,从而创建无缝的表面。

水网格体Actor

水网格体Actor(Water Mesh Actor) 可控制表面网格体的质量,该网格体构成放入关卡中的各个水体的图块。各个水体还对关卡中的大小设置了自己的硬性限制。它还提供了特定于海洋水体的额外选项。

watermeshactordetails.png

在使用高度曲面细分的表面和大的范围时,这些设置可显著影响性能。

水网格体细节级别缩放和曲面细分

细节级别(LOD)或水网格体图块的处理方式是,每帧遍历一个四叉树,生成屏幕上可见图块的最优集合。接着,这些图块会针对每个细节级别尽可能折叠,在最重要的地方(即最接近当前摄像机视图的地方)应用更大或更小的密度。

每个细节级别由摄像机视图周围基于距离的同心圆构成,细节级别越低离摄像机越远,并且包含的顶点数是上一级别的一半。

若使用传统细节级别的几何结构(例如静态网格体),几何结构会基于屏幕大小在不同级别之间快速过渡,这可能导致网格体在不同级别之间切换时显示比较明显的过渡。由于水系统使用网格体图块来表示表面,随着细节级别的过渡,这些级别会彼此变入和变出,这样四个四叉树会在切换到更低的细节级别时变为单个四叉树,或在切换到更高的细节级别时变为16个四叉树(参阅下面的示例)。

4x4 四边形网格至 2x2 四边形网格

四边形网格变形示例场景

4x4四叉树网格变为2x2网格又变回来的示例。

《堡垒之夜》中的水LOD过渡示例。

水网格体Actor提供了功能按钮来显式定义网格体图块的细节级别和曲面细分量。其中每个属性都彼此独立地起作用,但应同时配置,以在水面的性能和质量之间实现良好的平衡。

每个同心细节级别的大小半径由 LODScale 属性控制。它设置与摄像机的距离,图块应从此距离开始变为更低的细节级别。

曲面细分因子(Tessellation Factor) 通过增加图块包含的顶点数,设置了对于放入关卡中的所有水体,你想要网格体图块拥有的质量程度。较高程度的曲面细分对湖泊和海洋水体最为有益,尤其是有波峰很大、波谷很低的波浪时。

设置这些属性时,请务必平衡以下各项内容:

  • 高质量特写镜头,使玩家可看到更精细的细节

  • 拉远距离后质量变低,但这对于玩家来说并不重要

  • 曲面细分质量的性能成本

请记住,你的水材质也可能具备水系统不需要通过曲面细分处理的精细细节。

通过以下方法启用水图块的可视化:

  • 在关卡视口中使用 笔刷线框(Brush Wireframe) 视图模式。如果你在场景中没有大量几何结构,或者只有可见的水网格体,这种方法非常适合。

  • 使用控制台命令将水网格体渲染为线框:

    • r.Water.WaterMesh.ShowWireframe 1 会将所有水网格体显示为线框。

    • r.Water.WaterMesh.ShowWireframeAtBaseHeight 1 会将所有水网格体显示在其平底高度位置。

水网格体图块大小、范围和远距离

水网格体Actor提供了选项,用于定义构成关卡的水网格体的各个图块的大小,定义每个有多少图块,并且该Actor还处理海洋中水天相接处的长距离情况。

WaterMeshTileSettings.png

图块大小(Tile Size) 属性设置了构成水网格体的各个图块的大小。这些是按默认世界单位测量的。提高/降低"图块大小(Tile Size)"会缩放构成关卡中的水网格体的所有图块。

graph_gridtilesize.png

graph_gridtilesize_example1.png

graph_gridtilesize_example2.png

图块大小网格示例

水网格体图块大小:2400(默认大小)

水网格体图块大小:1000

图块范围(Extent in Tiles) 属性设置了构成水网格体的各个图块的数量。范围是针对XY轴从水网格体中心到边缘进行测量的。

graph_gridtileextents.png

graph_gridtileextents_example1.png

graph_gridtileextents_example2.png

图块范围网格示例

图块范围:64(默认大小)

图块范围:32

远距离(Far Distance) 用于填充"图块范围(Extent in Tiles)"属性所用最远端图块与地平线之间的空间。这会添加一个低顶点水网格体,它会造成海洋水体图块无限延伸的错觉。

graph_fardistance.png

graph_fardistance_example.png

远距离网格示例

远距离水网格体已启用

此远距离水网格体位于海洋水体基底高度位置正下方,因此它限制了剪辑片段操作,避免了可能变为可见的任何接缝。它还使用单独的材质,应该将其应用于水网格体Actor的 远距离材质(Far Distance Material) 指定槽。该材质可以很简单,实际上只需要匹配颜色,就可以创造从平铺水网格体无缝混合的效果。

使用 远距离网格体范围(Far Distance Mesh Extent) 属性可设置简化网格体延伸的距离(按世界单位计算)。

下面的场景示例使用了海洋水体,其中显示了水体如何从地面冒出来。注意,水体看起来并没有与地平线(左侧)相接。水网格体Actor的"远距离(Far Distance)"属性填充了这个缺口,同时在水体和远距离网格体之间创造了无缝的外观。

水网格体Actor远距离:已禁用

水网格体Actor远距离:已启用

从空中看,高度曲面细分的水网格体终止的地方清晰可见。使用匹配颜色的远距离网格体时,它可以轻松填充场景,并减少性能影响,同时无缝匹配详细的水网格体。

水网格体Actor远距离:已禁用

水网格体Actor远距离:已启用

基底水材质有一种称为 Water_FarMesh 的简化材质实例,在内容浏览器的 Water Content/Materials/WaterSurface 文件夹中可供使用。

水材质和水下后期处理

水系统使用多种不同类型的材质来处理水面渲染,以及不同类型水体之间的过渡,如江河流入海洋。水系统还使用后期处理材质来定义水面以下的外观。

每个水体都有一组材质指定槽,可用于重载预配置的默认水材质。

underwaterpostprocesssettings.png

水体Actor材质

江河、湖泊和海洋的水体全都使用相同的材质(Water_Material)作为基底。它包含特定于每种水体类型的一组开关和参数,这样单个源材质可以用于驱动所用的所有类型的水。将为每种水体类型(江河、湖泊、海洋)创建一个材质实例,并且每个实例会启用一个开关,用于确定对应于该水体类型的可用参数。此工作流程在每种水体类型材质之间维持一致的外观和设计。

在下面的图像中,你可以看到浮点值、RGBA颜色的参数,以及用于启用和禁用材质路径的开关是如何定义的。参数可通过子材质实例进行访问,其中可以覆盖父材质的参数,以更改材质的外观。

带有开关和参数的基底材质

使用重载开关和参数的材质实例

点击查看大图。

对于使用湖泊、海洋或江河材质的水体类型,大部分材质参数类似。但江河材质是一个例外。江河材质包含其他水体材质所不具备的特定参数,如速度、流量控制、密度等等。但是,江河水体没有波浪的参数,而海洋和湖泊却有此参数。

在内容浏览器中打开 Water Content/Materials/WaterSurface 文件夹,探索每种不同的水体类型材质实例。

江河水体材质过渡

江河水体允许水沿着不同位置之间的样条线流动,并且可以源自湖泊、海洋、江河或其任意组合。与湖泊和海洋不同,江河有大致的水流方向。它可以从湖泊流入海洋或另一个湖泊,甚至可以沿途与另一条江河合流。

由于江河有不同于湖泊和海洋的一组属性(即,江河不会产生波浪),因此江河使用过渡性材质从 江河到湖泊江河到海洋 过渡无缝混合。江河水体具有与湖泊和海洋水体相同的图块网格体,因此过渡性材质就能够很好地融合到所接触到的任何其他水体的表面。

过渡性材质是江河水体的默认材质实例。要让关卡中的水有一致的外观,唯一需要的设置是,手动将其颜色匹配到所使用的任何其他湖泊、海洋(和江河(水体材质。

在下面的简单场景示例中,使用了一个地块,在中心包含湖泊水体,围绕岛屿的是海洋水体,连接两者的是江河水体。过渡性材质处理了水开始从湖泊流入江河,再从江河过渡到海洋的过程。每种水体和过渡材质都匹配了颜色,以保证一致。

waterbody_rivertransitions.gif

水下后期处理

视你的项目而定,有必要确定水如何从水面上方过渡到下方。水系统使用后期处理来处理这个方面。

每个水体都指定了 水下后期处理材质(Underwater Post Process Material),以使用后期处理材质驱动穿过水面的过渡。摄像机位于给定水体边界之内,沉没到水面以下时,会自动进行水下后期处理。后期处理材质还会屏蔽掉场景中不在水下的部分来创建部分水下的视图,从而处理进入和离开水面的过渡。

water_underwaterpostprocessing.png

每种水体的 细节(Details) 面板包含Actor的特定设置,并且可在其中访问 后期处理设置(Post Processing Settings),进一步调整水下的外观,无需打开并手动配置材质属性。

water_underwaterpostprocessingmaterialslot.png

出于优化目的,仅当摄像机在水面以下或略微露出水面之上时,才会进行水下后期处理。这是为了考虑湖泊和海洋的情况,其中波峰和波谷可能会导致摄像机完全或部分沉没水下。需要启用 生成碰撞(Generate Collision),才能进行此水下后期处理。

此外,水体图块网格体能够使用江河水体的过渡性材质无缝混合。但是,如果水下后期处理的外观在两种水体之间差异显著(例如,从清澈的江河流入浑浊的湖泊),那么随着摄像机在两种后期处理体积之间移动,会显示一种硬过渡。

单层水材质着色模型

单层水(Single Layer Water) 着色模型可用于所有默认水材质,因为它能使用单厚度层提供一种经济高效的半透明方法。这种基于物理原理的着色模型支持水面上恰当的光散射、吸收、反射和折射以及阴影投射。

Water_singlelayerwatermaterial.png

指定给水体的所有默认水材质都使用"单层水(Single Layer Water)"着色模型。任何着色模型都可以用于水体。

要获取有关此着色模型的更多信息,请参阅单层水着色模型

创建自己的水材质

你可以创建自己的水材质来配合水系统使用,因此你不必专门使用指定给每种水体的默认水材质。

设置自己的材质时,请记住以下几点:

  • 水体支持使用任何类型的着色模型的水材质。

  • 材质需要启用 用于水(Used with Water)用法标记(Usage Flag)。每当将材质指定给不同类型的Actor时,此标记应该会自动启用,并且该材质将重新编译。如果不是这种情况,材质未正确渲染,请检查此标记是否已启用。

  • SingleLayerWater 着色模型可提供半透明和照明结果,成本以比传统半透明材质更低。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消