虽然所有 材质 都可以用于 地形 Actor,但在虚幻引擎5(UE5)中,材质系统提供了一些特定于地形的材质节点,有助于改善地形纹理。在本文档中,我们将介绍这些材质节点如何运作,以及如何在地形材质中使用它们。
你在材质编辑器中按照修改其他材质的方式修改材质以用于地形。
图层权重和排序
地形使用权重混合而不是alpha混合,因此任意位置所有图层的混合因子之和将为1.0。Alpha混合很有用,因为它不依赖于顺序,这样你可以随时绘制任意图层。此外,当你使用alpha混合时,alpha图层权重会提高,而其他现有图层权重则会降低。
但是,使用alpha混合的缺点在于,当一个图层绘制为100%时,其他所有图层的权重值将为0%。使用绘制工具删除已经为100%的图层时,会出现这种情况。由于其他图层为0%,该工具没有东西可用于替换你要删除的100%层,所以该图层看起来好像没有变化。
地形特定的材质节点
在材质编辑器内部,有六个可用于地形系统的节点。你可以在 控制板(Palette) 菜单中的 地形(Landscape) 类别下找到所有这些节点。
点击查看大图。
Landscape Layer Blend节点
你可以使用 LandscapeLayerBlend 节点将多个纹理或材质网络混合在一起,以便用作地形图层。LandscapeLayerBlend使用数组来存储有关地形图层的信息。要将图层添加到此数组,请选择加号图标。
点击查看大图。
将多个图层添加到 LandscapeLayerBlend 节点时,图层名称会填充到LandscapeLayerBlend节点中。
点击查看大图。
编号 | 属性 | 说明 |
---|---|---|
1 | 图层(Layers) | 节点包含的图层列表。你可以点击加号图标(![]() |
2 | 更多图层(Additional Layers) | 这些显示更多图层在折叠时的外观。 |
3 | 图层名称(Layer Name) | 你为图层提供的唯一名称。图层名称(Layer Name) 对应于地形工具窗口中的绘制模式中使用的图层名称。 |
4 | 混合类型(Blend Type) | 为 LB_AlphaBlend、LB_HeightBlend 或 LB_WeightBlend 。请参阅此页面上的地形图层混合类型(Landscape Layer Blend Types)。 |
5 | 预览权重(Preview Weight) | 这是在材质编辑器中预览混合时图层的权重值。 |
6 | 常量图层输入(Const Layer Input) | 这用于提供数字值,作为不希望使用纹理时使用的颜色。这主要用于调试有问题的图层。 |
7 | 常量图层输入(Const Layer Input) | 这用于提供数字值,作为不希望使用纹理时的高度。 |
下表详细说明了 Layer Blend 节点输入和输出。
点击查看大图。
编号 | 项目 | 说明 |
---|---|---|
1 | 图层LayerName(Layer LayerName) | 每个图层添加一个输入,供图层混合在一起。此输入仅当在 细节(Details) 面板中添加和命名图层之后才可用。 |
2 | 高度LayerName(Height LayerName) | 这是你提供高度图用于混合的的地方。此输入仅在其 混合类型(Blend Type) 属性设置为 LB_HeightBlend 的图层上可见。 |
3 | 无标记输出(Unlabeled Output) | 混合在一起的图层的结果。 |
混合图层
使用特定组合的图层混合模式时,在地形上不同图层的相交处,可能到处都是黑斑。将LB_HeightBlend模式用于多个地形图层时,此问题尤其普遍。LB_HeightBlend的工作方式是使用指定高度值调制图层的混合因子或权重。如果一个区域绘制了多个图层,并且全部设置为LB_HeightBlend,有可能特定区域中绘制的所有图层的高度值都同时为0,因此每个图层的所需混合因子将变为0。
由于没有隐式或显式排序,结果将为黑斑,因为所有图层都不会作用于该区域。混合法线贴图时,情况会更严重,因为产生的法线值为(0,0,0),该值不仅无效,还会导致光照发生渲染问题。此问题的解决方案是将 LB_AlphaBlend 用于某个图层,如以下示例所示。
在左图中,所有图层是LB_HeightBlend,导致一些区域为黑色。在右图中,红色的"1"层已更改为使用LB_AlphaBlend,从而解决了该问题。
点击查看大图。
下面是 Landscape Layer Blend 节点的属性示例,该节点用于混合在一起的所有图层。请注意 土壤(Soil) 图层如何将混合模式设置为LB_AlphaBlend,而其他图层如何将其混合模式设置为LB_HeightBlend。这是为了防止发生上述问题(图层相交处出现黑斑)。
点击查看大图。
若要删除图层,请点击该图层的元素编号右侧的下拉箭头打开菜单,然后选择 删除(Delete) 。
点击查看大图。
Landscape Layer Coords节点
LandscapeLayerCoords 节点将生成UV坐标,用于将材质网络映射到地形地貌。
点击查看大图。
编号 | 属性 | 说明 |
---|---|---|
1 | 映射类型(Mapping Type) | ELandscapeCoordMappingType ,指定将材质(或网络)映射到地形时要使用的方向。 |
2 | 自定义UV类型(Custom UVType) | 要在地貌上使用的映射位置 CustomUVType 将输出UV坐标,以根据给定的属性值将材质映射到地形。 |
3 | 映射比例(Mapping Scale) | 将等分缩放应用于UV坐标。 |
4 | 映射旋转(Mapping Rotation) | 将旋转(以度为单位)应用于UV坐标。 |
5 | 映射平移[U](Mapping Pan [U]) | 将[U]方向的偏移应用于UV坐标。 |
6 | 映射平移[V](Mapping Pan [V]) | 将[V]方向的偏移应用于UV坐标。 |
7 | 无标记输出(Unlabeled Output) | 输出UV坐标以根据给定属性值将材质映射到地形。 |
Landscape Layer Switch节点
你可以使用 LandscapeLayerSwitch 节点,在特定图层不作用于地形的某个区域时排除某些材质运算。这样一来,你可以在特定图层的权重为零时删除不必要的计算,从而优化材质。
点击查看大图。
编号 | 属性 | 说明 |
---|---|---|
1 | 参数名称(Parameter Name) | 你为参数提供的唯一名称。 |
2 | 使用预览(Preview Used) | 如果选中,则使用预览。 |
3 | 使用图层(LayerUsed) | 当节点的属性中指定的图层由地形的当前区域使用时。 |
4 | 未使用图层(LayerNotUsed) | 当图层未由地形的当前区域使用并且权重为零时。 |
5 | 无标记输出(Unlabeled Output) | 使用图层(LayerUsed) 或 未使用图层(LayerNotUsed) 输入,取决于图层是否作用于地形的特定区域。 |
Landscape Layer Weight节点
LandscapeLayerWeight 表达式允许材质网络根据从地形材质获取的关联图层的权重来混合。此图层的权重用作混合两个输入网络的alpha值。
点击查看大图。
编号 | 属性 | 说明 |
---|---|---|
1 | 参数名称(Parameter Name) | 你为参数提供的唯一名称。 |
2 | 预览权重(Preview Weight) | 要在材质编辑器中用于预览的权重。 |
3 | 常量基础(Const Base) | 你可以在此处指定你希望地形使用的基础颜色 |
4 | 基础(Base) | 用于混合此层的网络。它通常是所有之前图层混合的结果,但如果它是第一个图层,则可以为空。 |
5 | 图层(Layer) | 要混合在一起以创建此图层的网络。 |
6 | 无标记输出(Unlabeled Output) | 根据所涉及图层的图层权重,输出 基础(Base) 和 图层(Layer) 输入之间的混合结果。 |
Landscape Visibility Mask节点
LandscapeVisibilityMask 节点会删除地形的可见部分,这样你可以在地形中创造一些洞,以便产生洞穴等等。
点击查看大图。
编号 | 属性 | 说明 |
---|---|---|
1 | 无标记输出(Unlabeled Output) | 输出可视性遮罩属性。 |
确保输出连接到材质的 不透明遮罩(Opacity Mask) 插槽,并且 材质混合模式(Materials Blend Mode) 设置为 已遮罩(Masked) 。否则,该节点可能无法正常运行。
点击查看大图。
地形图层混合类型
地形 Layer Blend 材质节点有三种不同的混合模式可供选择。每种不同的图层混合 类型用于尝试实现不同的结果。
混合类型 | 功能 |
---|---|
LB权重混合(LB Weight Blend) | 如果你的图层来自外部程序,例如World Machine,或者你想要在无需担忧图层顺序的情况下独立绘制图层,这种模式很适合使用。 |
LB Alpha混合(LB Alpha Blend) | 如果你想绘制细节,并且需要定义的图层顺序,这种模式很适合使用。例如,在岩石和草上面绘制雪将遮挡岩石和草,但擦除雪将露出下面的岩石和草。 |
LB高度混合(LB Height Blend) | 这种模式与LB_WeightBlend相同,但还根据高度图在层之间的过渡中增加了细节。例如,它允许在图层过渡点处岩石之间的缝隙中显示灰尘,而不是仅仅在岩石与灰尘之间平滑混合。 |
这是 LB高度混合(LB Height Blend) 的运行效果示例。如你所见,在图层过渡点处,岩石之间的缝隙中显示了灰尘。这样一来,在图层相交处可以实现很好的过渡效果。

地形图层混合技术信息
在后台,这些图层节点的行为类似于Static Switch Parameter节点,允许你从使用材质的一个部分切换为使用另一个部分。地形的每个组件都从主地形材质创建了自己的 MaterialInstanceConstant,并且仅应用于该组件。如果在特定地形组件上未使用特定图层,将废弃连接到该图层的节点子树。这降低了总体材质复杂度,允许应用于地形的材质包含任意数量的纹理取样,只要任意单独组件上使用的取样数量绝不超过着色器模型规格设置的最大值(对于SM 3.0为16)即可。
这意味着,在设置主材质时可以包含地形上任意位置使用的每个纹理或网络。这样最终可能产生非常复杂的网络集合,同时仍将应用于地形组件的最终材质控制在硬件允许的参数范围内。
材质表达式的所有网络都可以连接到 图层(Layer) 输入来取代简单的 TextureSample 。这使得执行更复杂的效果成为可能,例如根据图层的观看距离从细节纹理过渡到更大的宏观纹理。
曲面细分和置换
材质的 曲面细分乘数(Tessellation Multipliers) 和 世界置换(World Displacement) 通道可以与地形地貌一起使用,在地形靠近摄像机时提供更多细节和变形。它们的工作方式与其他所有标准材质完全相同,并且图层混合可以与它们一起使用,就像 基础颜色(Base Color) 、 法线(Normal) 或其他通道那样。地形还将仅在最高细节级别(LOD)渲染硬件曲面细分,它将随着地形靠近第二个LOD而淡出。后续LOD不再启用曲面细分,从而在地形地貌上为置换启用了曲面细分时显著提高性能。
这些功能仅限于在启用了DirectX 11的情况下使用。因此,除非你专门针对DirectX 11硬件,否则它们应该作为次级抛光效果使用。你可以查看曲面细分乘数页面,详细阅读如何在项目中启用和使用曲面细分。

在上面的可视化中,渲染最高LOD(白色)时启用曲面细分,渲染其他LOD(彩色)时不启用曲面细分。
移动地形材质
移动地形不再局限于三个地形图层。虽然三个图层仍是最优情况,但只要有足够的纹理采样器,就可以支持任意数量的图层。地形层分配现在接受Feature Level Switch材质节点,允许单个PC或主机地形材质同时具备移动版本。下图显示了PC和主机版本的 《堡垒之夜》 大逃杀中使用的地形在用于移动设备时的情况。

使用层混合
能够将多个纹理和材质混合为可绘制的地形图层,是对地形地貌制作纹理的基础。为了将图层混合在一起,你可以使用多个 LandscapeLayerWeight 节点,也可以使用一到两个 LandscapeLayerBlend 节点,具体取决于你是否使用法线贴图。
使用Landscape Layer Weight节点
LandscapeLayerWeight 节点的设置和用法相当简单,下面将对此进行概述。
所有图层名称必须唯一,所以我们推荐使用表明图层所含内容的描述性名称来命名图层。这有助于你记住内容在图层中的哪个位置,并帮助你更快在层中导航。
-
在 材质编辑器(Material Editor) 中,将 LandscapeLayerWeight 节点添加到材质图表默认情况下,它的 参数名称(Parameter Name) 将为"None"。
点击查看大图。
-
在 细节(Details) 面板中,将 参数名称(Parameter Name) 更改为图层的描述性名称,例如"Rock"。 输入 参数名称(Parameter Name) 后,它将在节点本身上更新。
点击查看大图。
-
添加更多 LandscapeLayerWeight 节点,直至你希望材质拥有的每个图层都有一个节点。在此示例中,我们将仅使用两个 LandscapeLayerWeight 节点。
-
将 Texture Samples 或其他材质网络表达式添加并连接到 LandscapeLayerWeight 节点。
-
添加 LandscapeLayerCoords 节点,将其UV标题设置为你所需的内容,并将其连接到 Texture Sample 节点。
-
从每个 Layer 节点的输出引脚拖移到下一个图层节点的 基础(Base) 引脚,用引线将它们连接起来(不连接第一个图层节点的 基础(Base) 引脚)。
-
从最后一个 Layer 节点的输出引脚拖移到材质的 Base 节点的 基础颜色(Base Color) 输入。
完成后,你应该会获得类似下例使用 LandscapeLayerWeight 节点的结果:
点击查看大图。
你可以更改 LandscapeLayerWeight 节点的 预览权重(Preview Weight) 属性,预览不同权重对材质的影响。
使用Landscape Layer Blend节点
作为使用 LandscapeLayerWeight 节点手动将图层混合在一起的替代方法,LandscapeLayerBlend 节点使用alpha混合或带基于高度的偏移的alpha混合将多个图层混合在一起。基于高度的偏移允许基于高度图输入将图层与其他图层混合。
-
在材质编辑器中,添加 LandscapeLayerBlend 节点。
-
在 细节(Details) 面板中的 图层(Layers) 旁边,点击加号图标(
)以添加图层。
点击查看大图。
-
展开该图层以查看其属性。
-
将 图层名称(Layer Name) 更改为该图层的描述性名称,例如"Snow"。
点击查看大图。
-
确定你是希望图层进行alpha混合还是高度混合,并相应设置 混合类型(Blend Type) 。
-
为地形材质添加所需数量的其他图层。将其重命名,并相应设置其 混合类型(Blend Type) 。
-
将LandscapeLayerBlend节点的输出连接到材质的Base节点的 基础颜色(Base Color) 输入。
-
添加Texture Sample节点,将其主输出连接到 LandscapeLayerBlend 节点的 图层(Layer) 输入。你也可以创建更复杂的材质网络,并将其连接到Landscape Layer Blend 图层(Layer) 输入。对于所有高度混合图层,将纹理样本的alpha输出连接到LandscapeLayerBlend的 高度(Height) 输入。
完成后,地形材质网络将如下所示:
点击查看大图。
你可以更改 LandscapeLayerBlend 节点的 预览权重(Preview Weight) 属性,预览不同权重对材质的影响。
创建地形洞材质
在地形中创建洞可以在管理模式中完成,但只能通过一次性删除全部地形组件的方式来完成。要解决这种情况,你可以使用地形洞材质遮罩地形上特定位置的可视性和碰撞。如果你想在山体一侧开一个洞穴入口,这样做效果非常好。
你可以将相同的材质用于地形材质和地形洞材质,但请注意,使用不透明遮罩的材质在性能方面成本比不使用不透明遮罩的材质更高。这就是你可以选择创建单独的地形洞材质的原因。
-
打开材质编辑器,在 细节(Details) 面板中,将 混合模式(Blend Mode) 设置为 已遮罩(Masked) 。
点击查看大图。
-
接下来,将 LandscapeVisibilityMask 节点添加到材质图表,并将其输出连接到 不透明遮罩(Opacity Mask) 输入。
点击查看大图。
-
材质编译完成后,现在就需要将其分配给地形,以便可以使用。这可以在 细节(Details) 面板中的 地形洞材质(Landscape Hole Material) 分段中完成。
点击查看大图。
-
现在,你可以正常设置地形材质的其余部分,完成后,应该会获得如下所示的效果。
点击查看大图。
现在你应该可以遮罩和取消遮罩地貌的可视性,如以下视频所示。
如需了解如何使用绘制工具创建地形洞,请参阅使用不透明遮罩创建洞。
将材质分配给地形
为地形创建材质后,你需要将该材质分配给关卡中的地形Actor来使用该材质。
-
在 内容浏览器(Content Browser) 中找到你想使用的地形材质。
-
在视口或 世界大纲视图(World Outliner) 中选择地形。
-
在关卡编辑器中该地形的 细节(Details) 面板的 地形(Landscape) 分段中 地形材质(Landscape Material) 旁边,点击分配箭头(
)以分配所选材质。
点击查看大图。
将地形洞材质分配给地形
你可以分配不同的材质来充当 地形洞材质,这是带有特定不透明设置的材质。
请参阅有关地形洞材质的分段,了解有关洞材质的一般信息。如需了解不透明遮罩,请参阅使用不透明遮罩创建洞。
-
在 内容浏览器(Content Browser) 中找到你想使用的地形洞材质并选择它。
-
在视口或 世界大纲视图(World Outliner) 中选择地形。
-
在关卡编辑器中找到 细节(Details) > 地形(Landscape) > 地形洞材质(Landscape Hole Material) 。选择箭头(
)以分配所选材质。
点击查看大图。