Language:
Page Info
Engine Version:
Share
此中文页面内容对应的英文页面有后续更新,如需浏览最新文档可切换至英文页面浏览。

地形材质

虽然任何随机 材质 都可以与 地形 Actor一起使用,但虚幻引擎4(UE4)中的材质系统确实提供了一些特定于地形的特殊材质节点,它们可以极大地帮助您更好地处理地形纹理。在下面的文档中,我们将深入了解这些节点,它们的工作方式,以及如何在地形材质中使用它们。

材质编辑器 中,您可以像修改其他材质一样修改与地形一起使用的材质。

图层权重和排序

地形使用权重混合而不是阿尔法混合,因此任何位置的所有图层的混合系数之和将为1.0。这样做的优点是不存在顺序依赖性—您可以在任何时间绘制任何图层,其权重将增加,而其他现有图层的权重将减少。缺点则在于,当您将一个图层完全绘制到100%时,其他所有图层的权重值将为0%。在使用绘制 工具移除一个已100%绘制的图层时,这一点显而易见。该工具不知道用什么其他图层来替换您要移除的图层,因此该工具最终似乎不会执行任何操作。

地形特定的材质节点

在材质编辑器中,您将发现有六种特殊节点可以与地形系统一起使用。您可以在 情境(Context) 菜单或在地形类别下的 面板(Palette) 菜单中找到所有节点。

情境菜单

Material Editor Context Menu

面板菜单

Landscape_Mat_Palette.png

地形图层混合节点

LandscapeLayerBlend 节点允许您将多个纹理或材质网络混合在一起,以便它们可以用作地形图层。LandscapeLayerBlend 使用一个阵列存储有关地形图层的信息。若要向该阵列添加图层,请单击条目旁边的加号图标:“0个元素(0 elements)”。

Landscape_Add_To_Array.png

当您将多个图层添加到 LandscapeLayerBlend 节点时,您会得到如下图所示的内容:

LandscapeLayerBlend Node

您可以在 材质编辑器(Material Editor)详细信息(Details) 面板中设置 LandscapeLayerBlend 节点的属性。

编号

属性

说明

1:

图层(Layers)

此节点所包含之图层的列表。您可以通过单击加号图标(Plus Sign)来添加图层。

2:

图层名称(Layer Name)

您给予图层的唯一名称。图层名称(Layer Name) 对应于在地形工具窗口中的绘制节点 中使用的图层名称。

3:

混合类型(Blend Type)

LB_AlphaBlendLB_HeightBlendLB_WeightBlend。这些将在本页稍后进行介绍。

4:

预览权重(Preview Weight)

它用作图层的权重值,以在材质编辑器中预览混合效果。

5:

常量图层输入(Const Layer Input)

它是为了在不希望使用纹理的情况下提供一个数值作为颜色。它主要用于调试有问题的图层。

6:

常量高度输入(Const Height Input)

它是为了在不希望使用纹理的情况下提供一个数值作为高度。

7:

其他图层(Additional Layers)

它们是其他图层处于折叠状态时的外观。

Landscape_LayerBlend_Node.png

下表详细说明了 图层混合节点的 输入和输出。

编号

项目

说明

1:

Layer(图层) *LayerName(图层名称)

每个图层均添加一个图层输入以便混合在一起。在 详细信息(Details) 面板中添加图层之前,这些输入将不可用。

2:

Height(高度) *LayerName(图层名称)

这是您提供高度图以进行混合的地方。请注意,此输入将仅在 混合类型(Blend Type) 属性设置为 LB_HeightBlend 的图层上可见。

3:

无标记输出(Unlabeled Output)

混合在一起的图层的结果。

使用某些图层混合模式组合时,在地形上不同图层的相交处,您可能会以黑点结束。当针对多个图层使用LB_HeightBlend模式时,此问题尤为普遍。LB_HeightBlend通过使用指定高度值调整图层的混合系数或权重来工作。当您在一个区域上绘制多个图层,并且它们都被设置为LB_HeightBlend时,在特定区域中绘制的所有图层可能同时具有为0的高度值,因此每个图层的所需混合系数将变为0。由于没有隐式或显式排序,所有图层对都不会对该区域有任何贡献,因此结果将为黑点。当混合法线贴图时,情况则更糟,因为这会导致一个为(0,0,0)的法线值,该值不仅无效而且会引起照明出现渲染问题。该问题的解决方案是针对其中一个图层使用 LB_AlphaBlend,类似于以下示例。LB_HeightBlend Problem

在左图中,所有图层都为LB_HeightBlend,从而导致一些区域为黑色。在右图中,红色的“1”层已经更改为使用LB_AlphaBlend,从而解决了该问题。

下面是有关 Landscape Layer Blend 节点的属性的一个示例,该节点用于多个混合在一起的图层。请注意 土壤(Soil) 图层如何将混合模式设置为LB_AlphaBlend,而其他图层如何将其混合模式设置为LB_HeightBlend。这是为了阻止上面提到的问题(图层的相交处出现黑点)的发生。

Layer Blend Properties

若要删除一个图层,请单击图层元素号右侧的下拉箭头以打开情境菜单,然后单击 删除(Delete)

Delete Layer

地形图层坐标节点

LandscapeLayerCoords 节点生成可用于将材质网络映射到地形的UV坐标。

LandscapeLayerCoords Node

您可以在 详细信息(Details) 面板中设置 LandscapeLayerCoords 节点的属性。

编号

属性

说明

1:

映射类型(Mapping Type)

ELandscapeCoordMappingType,指定将材质(或网络)映射到地形时要使用的方向。

2:

自定义UV类型(Custom UVType)

地形上要使用的贴图位置。CustomUVType 输出UV坐标,以根据给定的属性值将材质映射到地形。

3:

映射比例(Mapping Scale)

要应用于UV坐标的等分缩放。

4:

映射旋转(Mapping Rotation)

要应用于UV坐标的旋转,其单位为度。

5:

映射平移[U](Mapping Pan [U])

要应用于UV坐标的[U]方向上的偏移。

6:

映射平移[V](Mapping Pan [V])

要应用于UV坐标的[V]方向上的偏移。

7:

无标记输出(Unlabeled Output)

输出UV坐标,以根据给定的属性值将材质映射到地形。

地形图层开关节点

当某一特定图层没有对地形的一个区域做出贡献时,LandscapeLayerSwitch 节点允许您排除某些材质运算。这允许您在某一特定图层的权重为零时通过移除不必要的计算来优化材质。

LandscapeLayerSwitch Node

您可以在 详细信息(Details) 面板中设置 LandscapeLayerSwitch 节点的属性。

编号

属性

说明

1:

参数名称(Parameter Name)

您给予参数唯一名称。

2:

已使用预览(Preview Used)

如果选中,使用预览。

3:

已使用图层(LayerUsed)

当节点属性中指定的图层被地形的当前区域使用时要使用的结果。

4:

未使用图层(LayerNotUsed)

当该图层不被地形的当前区域使用且权重为零时要使用的结果。

5:

无标记输出(Unlabeled Output)

LayerUsedLayerNotUsed 输入,取决于该图层是否对地形的特定区域有贡献。

地形图层权重节点

LandscapeLayerWeight 表达式允许基于相关图层的权重来混合材质网络,该相关图层从应用材质的地形中获得。

LandscapeLayerWeight Node

您可以在 详细信息(Details) 面板中设置 LandscapeLayerWeight 节点的属性。

编号

属性

说明

1:

参数名称(Parameter Name)

属于要与该表达式关联的地形的图层的名称。该图层的权重将用作混合两个输入网络的阿尔法值。

2:

预览权重(Preview Weight)

在材质编辑器中用于预览的权重。

3:

常量底层(Const Base)

您可以在此处指定一个您想要地形拥有的底色

4:

底层(Base)

将与该图层混合的网络。它通常是所有之前图层混合的结果,但如果它是第一个图层,则可以为空。

5:

图层(Layer)

将混合在一起以创建该图层的网络。

6:

无标记输出(Unlabeled Output)

根据所涉及图层的图层权重,输出 底层(Base)图层(Layer) 输入之间混合的结果。

地形可视性遮罩节点

LandscapeVisibilityMask 节点用于移除地形的各个部分的可视性,以便您可以创建洞,例如用于创建洞穴。

LandscapeVisibilityMask Node

您可以在 详细信息(Details) 面板中设置 LandscapeVisibilityMask 节点的属性。

编号

属性

说明

1:

无标记输出(Unlabeled Output)

输出可视性遮罩属性。

要使该节点正确工作,您所要做的是确保其输出连接到材质的 不透明遮罩(Opacity Mask) 槽,且 材质混合节点(Materials Blend Mode) 设置为 遮罩(Masked)

Landscape_VisibilityMaskSetup.png

图层混合

能够将多种纹理和材质网络混合到可绘制的地形图层中是对地形进行纹理处理的基础。为了将图层混合在一起,您可以使用多个 LandscapeLayerWeight 节点,也可以使用一到两个 LandscapeLayerBlend 节点,这取决于您是否使用法线贴图。

使用地形图层权重节点

设置和使用 LandscapeLayerWeight 节点是一个非常简单的过程,下面将对此进行概述。

因为图层名称必须是唯一的,所以最好是尽量为每个图层给出一个描述性名称。

  1. 材质编辑器 中,将一个 LandscapeLayerWeight 节点添加到材质图表。默认情况下,它会有一个 参数名称 “None”。

    Landscape_Layer_Weight_Base.png

  2. 详细信息(Details) 面板中,将该 参数名称 更改为图层的描述性名称,例如“Rock”。

    Layer Name

    输入一个 参数名称 后,它自己会在节点上进行更新。

    Landscape_Layer_Weight_Named_Layer.png

  3. 添加其他 LandscapeLayerWeight 节点,直到您希望材质拥有的每个图层都有一个节点。在此示例中,我们将只使用两个 LandscapeLayerWeight 节点。

  4. 纹理样本 或其他材质网络表达式添加到 LandscapeLayerWeight 节点并进行连接。

  5. 添加一个 LandscapeLayerCoords 节点,将其UV标题设置为想要的标题,并将其连接到 纹理样本 节点。

  6. 从每个 图层 节点的输出引脚拖至下一个图层节点的 底层(Base) 引脚,用导线将它们连接起来(不连接第一个图层节点的 底层(Base) 引脚)。

  7. 从最后一个 图层 节点的输出引脚拖至材质的 底层(Base) 节点的 底色(Base Color) 输入。

完成后,您应该会获得类似下例使用 LandscapeLayerWeight 节点的结果:

Landscape Layer Nodes

您可以通过更改 LandscapeLayerWeight 节点的 预览权重(Preview Weight) 属性,来预览不同权重在材质上的效果。

使用地形图层混合节点

作为使用 LandscapeLayerWeight 节点手动将图层混合在一起的替代方法,LandscapeLayerBlend 节点使用阿尔法混合或带基于高度的偏移的阿尔法混合将多个图层混合在一起。基于高度的偏移允许基于高度图输入将图层与其他图层混合。

使用LandscapeLayerBlend节点:

  1. 在材质编辑器(Material Editor)中,添加一个LandscapeLayerBlend节点。

    Landscape_LayerBlend_Material_Example_00.png

  2. 详细信息(Details) 面板中,单击 图层(Layers) 旁边的加号图标(Plus Sign)以添加一个图层。

    Landscape_LayerBlend_Material_Example_01.png

  3. 展开该图层以查看其属性。

    Layer Properties

  4. 参数名称 更改为该图层的一个描述性名称,例如 “Rock”。

    Layer Name

  5. 确定您希望该图层是阿尔法混合型还是高度混合型图层,并相应地设置 混合类型(Blend Type)

    Blend Type

  6. 为地形材质添加所需数量的其他图层。对它们进行重命名,并相应地设置 混合类型(Blend Type)

  7. 将LandscapeLayerBlend节点的输出连接到材质的基本节点的 底色(Base Color) 输入。

  8. 添加纹理样本节点,并将它们的主要输出连接到 LandscapeLayerBlend 节点的 图层(Layer) 输入。(或者,您可以创建一个更复杂的材质网络,并将其连接到LandscapeLayerBlend的 图层(Layer))对于任何高度混合图层,将纹理样本的阿尔法输出连接到LandscapeLayerBlend的 高度(Height) 输入。

完成后,地形材质网络将如下所示:

Landscape Blend Node

您可以通过更改 LandscapeLayerBlend 节点的 预览权重(Preview Weight) 属性,来预览不同权重在材质上的效果。

地形图层混合类型

地形 图层混合 材质节点有三种不同的混合模式可供选择。当您试图获得一个不同的结果时,将使用每种不同的 图层混合 类型。

混合类型

功能

LB权重混合(LB Weight Blend)

如果您的图层来自外部程序,例如World Machine,或者如果您想要在无需担忧图层顺序的情况下独立绘制任何图层,这种模式很适合使用。

LB 阿尔法混合(LB Alpha Blend)

如果您想要绘制细节,而且还想要有一个定义的图层顺序,从而使在岩石和草地上绘制积雪将遮挡它们,而擦除积雪将恢复显示积雪下面的岩石和草地,这种模式将非常适用。

LB高度混合(LB Height Blend)

这种模式与LB_WeightBlend基本相同,但它还根据高度图向图层之间的过渡添加了细节。例如,它允许在图层过渡点处岩石之间的缝隙中显示灰尘,而不是仅仅在岩石与灰尘之间平滑混合。

下面是使用 LB高度混合(LB Height Blend) 的一个示例。正如您所看到的,在图层过渡点处,岩石之间的缝隙中显示了灰尘。这样,在图层的相交处会获得一个很好的过渡。

LB_HeightBlend.png

地形图层混合技术信息

在后台,这些图层节点的行为类似于静态切换参数 节点,这允许您从使用材质的某一部分切换到使用另一部分。地形的每个组件都有自己的材质实例常量(MaterialInstanceConstant),它是从主要地形材质创建的,并且仅应用于该组件。如果某个特定的图层没有在某个特定的地形组件上使用,则连接到该图层的节点的分支树将被丢弃。这将降低材质的整体复杂性,允许应用于地形的材质包含任意数量的纹理样本,只要在任何单个组件上使用的样本数量不超过着色器模型规范所规定的最大数量(SM 3.0为16个)。这意味着,可以设置一个包含在地形上的任意位置使用的每个纹理或网络的主材质,它最终可以是一个非常复杂的网络集合,同时在硬件允许的参数范围内,仍保留应用于地形的各个组件的最终材质。

任何材质表达式的网络都可以连接到 图层 输入,而不是简单的 TextureSample。这使得执行更复杂的效果成为可能,例如根据图层的观看距离从细节纹理过渡到更大的宏纹理。

地形洞材质

在地形中创建洞是可以在管理模式 下完成的操作,但只能通过一次性删除全部地形组件来实现。为了解决这一问题,您可以使用地形洞材质来遮罩地形上某个位置的可视性和碰撞。如果您想要在山峰的一侧制作一个洞穴入口,这种方法是一个很不错的选择。

您可以针对地形材质和地形洞材质使用同一材质,但要注意,使用不透明遮罩的材质比不使用不透明遮罩的材质在性能方面需要付出更高的成本。这就是为什么您可以选择创建一个单独的地形洞材质的原因。

创建地形洞材质的方法:

  1. 首先,在材质编辑器中打开或创建一个新的材质。打开材质后,查看 详细信息(Details) 面板,并将 混合模式(Blend Mode) 设置为 遮罩(Masked)

    Landscape_BaseNodeOpacity.png

  2. 接下来,搜索一个 LandscapeVisibilityMask 节点并将其添加到材质图表,并将其输出连接到 不透明遮罩(Opacity Mask) 输入。

    Landscape_VisibilityMaskNode.png

  3. 现在,您可以像往常一样设置地形材质的剩余部分,完成后,您应该会获得如下所示的内容。

    Landscape_VisibilityMaskSetup_In_Material.png

  4. 在编译材质后,现在是时候将它指定到地形,以便可以使用它。这可以在 详细信息(Details) 面板的 地形洞材质(Landscape Hole Material) 部分完成。

    Landscape_Hole_Materail_Assign.png

  5. 完成所有工作后,您现在应该能够像下面视频中一样遮罩或取消遮罩地形的可视性。

有关使用绘图工具创建地形洞的信息,请参阅 使用不透明遮罩创建洞

将材质指定到地形

为地形创建一个材质后,必须将该材质指定到关卡中的地形Actor(Landscape Actor),以便能够使用和查看它。您可以按照以下方式将材质指定到地形Actor。

将材质指定到地形:

  1. 找到并选择想要在 内容浏览器 中使用的地形材质。

  2. 在视口中或在 世界场景大纲视图(World Outliner) 中选择地形。

  3. 在关卡编辑器中,在该地形的 详细信息(Details) 面板的 地形(Landscape) 部分,单击 地形材质(Landscape Material) 旁边的指定(Assign)箭头(Assign arrow)以指定选定材质。

    Assigned Material

您可以指定另一材质作为 地形洞材质,该材质是一种具有特定不透明度设置的材质,您可以在地形的各个部分上使用它来移除它们,以便创建洞,例如洞穴。

将地形洞材质指定到地形:

  1. 找到并选择想要在 内容浏览器 中使用的地形洞材质。

  2. 在视口中或在 世界场景大纲视图(World Outliner) 中选择地形。

  3. 在关卡编辑器中,在该地形的 详细信息(Details) 面板的 地形(Landscape) 部分,单击 地形洞材质(Landscape Hole Material) 旁边的指定(Assign)箭头(!(icon_assign_left_16x.png))以指定选定材质。

    Landscape_HoleSettings.png

有关使用地形洞材质的信息,请参阅 使用不透明遮罩创建洞

曲面细分和位移

材质的 曲面细分乘数(Tessellation Multipliers)世界场景位移(World Displacement) 信道可以与地形结合使用,以在地形靠近摄像机时提供更多的细节和变形。它们的使用与任何其他标准材质完全一样,并且图层混合可以与它们一起使用,就像与 底线法线 或任何其他信道一样。地形还将仅在最高细节级别(LOD)渲染硬件曲面细分,当地形接近第二个LOD时它们将逐渐淡出。后续LOD将不再启用曲面细分,当在地形上针对位移启用了曲面细分时,这将大大提高性能。

这些功能仅限于在启用了DirectX 11时使用。因此,它们应该作为次级抛光效果使用,除非您专门针对的是DirectX 11硬件。通过查看曲面细分乘数 页面,您可以了解有关如何在项目中启用和使用曲面细分的更多信息。

Landscape_HW_Tess.png

在上面的可视化中,渲染最高LOD(白色)时启用曲面细分,渲染其他LOD(彩色)时不启用曲面细分。

移动地形材质

移动地形不再局限于三个地形图层。虽然三个图层仍是一种优化情况,但只要有足够的纹理采样器(Texture Sampler),就可以支持任意数量的图层。地形图层分配现在采用功能级别切换材质节点 ,允许单个PC或控制台地形材质也有一个用于移动设备的版本。下图显示了PC和控制台版本Fortnite Battle Royal中使用的地形在移动设备中使用时的情况。

MobileLandscape_FeatureLevel.png