设置新的网格体分段需要多个不同的资产相互配合,从而提高开发效率,实现更高的可控性。 网格体地形的设计理念是,由核心技术美术或负责人定义一系列文件,例如网格体分段定义数据资产、变换器管线数据资产、材质、权重通道和优先级层。 这种结构能最大限度地减少着色器排列、不兼容的层结构、不必要的权重通道等等。
命名规范和标准
| 资产 | 资产类型 | 前缀 |
|---|---|---|
网格体分段定义 | 数据资产 | MPD_<Name> |
网格体分段变换器管线 | 数据资产 | TP_Compiled_<Platform>_<Name> TP_Preview_<Platform>_<Name> |
创建网格体分段定义
网格体分段定义设定了网格体地形的许多核心方面,包括材质、优先级层和权重通道等等。 你可以在多个网格体分段上使用相同的定义。
新建一个数据资产(Data Asset),选择网格体分段定义(Mesh Partition Definition)类。
将其命名为
MPD_<name>(MPD_代表MeshPartitionDefinition)。
设置网格体分段定义
创建完成后,打开新的网格体分段定义数据资产。 主要分为4个板块:
材质(Material)
修改器(Modifiers)
构建(Build)
预览
网格体分段定义——材质
材质设置可用于定义网格体分段定义使用的材质和相关通道。
| 参数 | 说明 |
|---|---|
材质(Material) | 网格体分段几何体使用的材质。 |
通道纹素大小(Channel Texel Size) | 控制属性通道(请参阅下方的通道)在运行时使用的烘焙纹理的分辨率。 |
物理材质通道(Physical Material Channels) | 定义网格体分段Actor可用的物理材质通道。 物理材质通道可以将具有指定属性数据的区域映射到特定物理材质。 |
默认物理材质(Default Physical Material) | 网格体分段使用的默认物理材质。 |
通道(Channels) | 用户定义的属性,可用于网格体分段几何体。 这些通道中的数据可以通过各种修改器或PCG绘制或注入。 修改器可以写入定义中未定义的通道,但仅适用于编辑器,不会转换为运行时已编译分段的纹理。 这些通道仍然可供其他可能读取它们的修改器和PCG使用。 这些通道可以用于多种用途。 例如:
|
网格体分段定义——修改器
在修改器设置中,你可以找到修改器层优先级(Modifier Layer Priorities),该设置定义了修改器的构建顺序。
在此创建你所需的优先级层。
首先构建分配给索引[0]的修改器。
其次构建分配给索引[1]的修改器,依此类推。
同一个层可以分配多个修改器。
修改器可以设置子优先级,你可以使用子优先级,手动排列修改器在指定层的效果顺序。 详情请参阅《创建网格体地形》文档中的修改器部分。
网格体分段定义——构建
你可以使用构建(Build)设置,为不同平台配置已编译分段的几何体生成。 已编译分段会序列化,以供运行时使用。
构建设置中包含以下内容:
| 已编译分段构建变体 | |
|---|---|
名称 | 构建变体的名称 |
最大分段复杂度(Max Section Complexity) | 每个分段的最大顶点数量 |
变换器管线(Transformer Pipeline) | 在此处选择变换器管线数据资产。 详情请参阅下文变换器管线部分。 |
| 平台——各平台运行时设置 | |
| 默认 | |
构建变体名称(Build Variant Names) | 选择在“已编译分段构建变体”设置中定义的一个构建变体作为默认构建变体。当已烘焙的平台名称与下方定义的任何平台条目都不匹配时,将使用此变体。 |
| 逐平台 | |
名称 | 为该平台元素命名。 |
构建变体名称(Build Variant Names) | 选择上方“已编译分段构建变体”中定义的一个构建变体,作为分配给此平台的构建变体。 |
网格体分段定义——预览
预览分段仅适用于编辑器,与运行时使用的已编译分段相互独立。 预览分段针对构建时间、失效和迭代进行了优化。 已编译分段针对目标平台进行了渲染优化。
预览设置中包含以下内容:
最大分段复杂度(Max Section Complexity) | 一个分段的最大顶点数量。 |
变换器管线(Transformer Pipeline) | 在此处选择变换器管线数据资产。 详情请参阅下文变换器管线部分。 |
变换器管线(Transformer Pipeline)
变换器管线是一种数据资产,可以为预览分段和已编译分段创建和配置各种功能。
变换器管线提供了一条用户可自定义编程的管线,用于定义为网格体分段构建网格体数据后会发生什么,以及如何将其转换为持久化数据(Actor和组件)。
由于变换器管线与网格体分段定义是相互独立的资产,因此可以轻松在不同的网格体分段定义上快速重复使用项目或平台定义的配置。
要创建变换器管线资产,请创建一个新的数据资产,并选择变换器管线(Transformer Pipeline)类。
在变换器管线数据资产中,你可以添加各种变换器。
可用的变换器类型包括:
碰撞变换器
远场变换器
RVT变换器(RVT = 运行时虚拟纹理)
裙边变换器
静态网格体变换器
子分段变换器
WP Actor属性变换器(WP = 世界分段)
碰撞变换器
碰撞变换器启用并定义碰撞几何体的生成,该几何体与可视网格体相互独立。
如果需要简化碰撞几何体,可以调整误差容差(Error Tolerance)设置。
远场变换器
远场变换器启用并定义一种特殊的网格体生成,用于Lumen的远场内部表示。
远场网格体边长(Far Field Mesh Edge Length) | 生成的远场网格体的目标边长。 |
RVT变换器
RVT变换器控制网格体分段运行时虚拟纹理(RVT)的可用性。
静态网格体变换器
静态网格体变换器启用并定义已编译和预览分段的静态网格体组件。 支持设置LOD和启用Nanite。
静态网格体变换器还提供为几何体添加裙边的选项,以防止在某些情况下出现接缝或裂缝。
子分段变换器
子分段变换器将分段进一步细分为小组件。
子分段大小(Sub Section Size) | 表示每个子分段的目标顶点数量。 |
子分段变换器在堆栈中的索引很重要,会影响后续变换器(索引值更高)。
WP Actor属性变换器
WP Actor属性变换器控制网格体分段的世界分段运行时网格、数据层分配和HLOD层。
配置静态网格体变换器简化设置
静态网格体变换器为每个分区单元构建一个静态网格体,并针对每个LOD插槽,在源几何体的副本上运行一个属性感知简化器。FMeshPartitionTransformerSimplificationSettings是该简化器的逐LOD编辑界面。 本节将介绍模式选择器、ScreenSize和PixelError,并为每种LOD策略提供一个实操示例。
工作流程概述
| 你想设置…… | 将模式设为 | ||
|---|---|---|---|
各LOD层级的几何误差预算(偏差单位为厘米) | 根据Error得出ScreenSize |
|
|
各LOD层级激活时的距离/屏幕尺寸 | 根据ScreenSize得出ErrorTolerance |
|
|
一个简易的调节参数,用于保持固定的三角形比例。 | 根据ScreenSize得出TriangleCount |
|
|
完全手动控制 | 自定义 | 所有字段 | 无 |
仅在需要禁止自动配对时选择自定义(Custom)。 之所以存在三种自动模式,是因为驱动值和派生值难以手动准确配对。
三种模式之间的关系
简化器通过三个独立的控制参数执行操作:
ErrorTolerance- 世界空间几何偏差预算(厘米,以虚幻引擎单位表示)。 当简化后的表面与原始表面的偏差超过此值时,停止折叠边缘。MaxTrianglesFraction/MinTrianglesFraction- 分数保留边界,用作限制阈值(或在ErrorTolerance非正数时,用作目标)。ScreenSize- 运行时判定该LOD为仍可接受的最粗糙级别时,屏幕上投射的直径。 LOD越小,屏幕尺寸越小;数值必须单调递减。
PixelError是ErrorTolerance和ScreenSize之间的转换因子。 从概念上来说,它指的是在激活该LOD的摄像机距离处,你能接受的几何误差像素数量。
内部转换使用固定的参考投影(1920×1080,HFOV 90°,与引擎静态网格体编辑器行为一致)。 它遵循标准自动LOD路径,因此通过这些模式得出的ErrorTolerance-ScreenSize对与静态网格体运行时选择LOD的方式一致。PixelError = 8是不透明渲染的地形或建筑网格体的合理默认值。
如需调整,你可以:
对于允许LOD在更近距离切换的背景或裙边,增加该值(例如16)。
对于主要网格体,在必须确保偏差不被察觉(除非屏幕上的LOD非常小)的情况下,应降低该值(例如2-4)。
模式示例
根据Error得出ScreenSize
如果你可以将每个LOD表示为相对于源的最大偏差(例如不超过X厘米),并且希望根据该误差在屏幕上的投射方式来确定LOD的激活屏幕尺寸,请使用此模式。
你需要配置:
ErrorTolerance- 随着LOD降级而增加(例如LOD0=0.5厘米,LOD1=2厘米,LOD2=8厘米)。PixelError- 在同一网格的各LOD之间保持一致。MinTrianglesFraction/MaxTrianglesFraction- 限制范围。MinTrianglesFraction防止非常平坦的网格体被简化为一个三角形。MaxTrianglesFraction确保即使误差预算允许保留所有三角形,也会强制执行一定程度的缩减。
无需配置ScreenSize。 变换器会测量简化后的实际对称豪斯多夫偏差,并通过PixelError将其投射到屏幕尺寸,然后写入LOD源模型。这是地形和粗模LOD的推荐默认设置,因为误差容差是一种直观的指标——它是一个长度值,并且无需考虑最终偏差在屏幕上的视觉表现。
调整循环:
按LOD设置
ErrorTolerance,ScreenSize=0。构建,然后检查日志:
ConfigStatic mesh transformer LOD2 simplified: 12345 -> 1234 tris (10.0% retained), ErrorTolerance=2.000000, achieved MaxDeviation symmetric=1.872 one-sided=1.640Static mesh transformer: LOD2 ScreenSize=0.142 (source: auto, ...)如果LOD切换得太晚或太早,请更改
PixelError(而不是ErrorTolerance)——这会将相同的几何体重新映射到不同的激活距离,无需重新运行简化器。如果实际达到的偏差远小于预算,说明三角形分数限制正在起约束作用。 提高
MaxTrianglesFraction,让简化器能够利用误差预算。
根据ScreenSize得出ErrorTolerance
如果已知某个LOD应在屏幕直径的特定比例(例如30%)处激活,并且希望根据该目标计算误差容差,请使用此模式。
你需要配置:
ScreenSize- 必须在LOD之间单调递减(例如LOD0 = 1.0,LOD1 = 0.5,LOD2 = 0.25,LOD3 = 0.1)。PixelError- 遵循上述一致性建议。MinTrianglesFraction/MaxTrianglesFraction- 限制范围。
引擎根据ScreenSize * PixelError * 边界半径得出ErrorTolerance;该字段呈灰色。
极端情况示例:如果将ScreenSize设为0,变换器将回退至几何默认值pow(0.75, LODIndex)(1.0、0.75、0.5625等),确保简化器仍有一个目标。 相同的回退会被反映到LOD的激活屏幕尺寸上,LOD会在其被简化时对应的尺寸下激活。 这意味着你可以将插槽留空,并且仍然可以产生合理行为,但使用显式值会更清晰。
根据ScreenSize得出TriangleCount
当你不信任几何误差指标,希望简单直接地控制三角形预算时,请使用此模式。
你需要配置:
仅
ScreenSize。 该值被重新解释为保留的三角形比例,限制在[0, 1]范围内。 例如,ScreenSize = 0.25保留25%的三角形。
引擎设置ErrorTolerance = 0(因此误差预算永远不会停止折叠),并设置MaxTrianglesFraction = ScreenSize(因此保留率是约束条件)。PixelError未使用。
在这种模式下,ScreenSize有两个作用:驱动简化器的保留分数目标和LOD的激活屏幕尺寸。 这是有意设计的——简化级别会随着LOD的屏幕占比而变化,但这意味着无法单独设置,比如将LOD2的激活屏幕尺寸设为0.3,将三角形设为10%。 选择其他模式。
自定义
所有字段均可编辑。 仅在需要解除ErrorTolerance和ScreenSize之间的配对关系时,才使用此模式(例如,针对一组约束调整简化器,同时明确选择与实际偏差无关的LOD激活尺寸)。 如果你发现自己在常规场景下使用“自定义(Custom)”,可能需要改用其中一种自动模式。
LOD链实操示例(四个LOD级别,地形样式网格体)
LOD0 — bReduceMesh = false (source geometry, ScreenSize defaults to 1.0), or use a conservative ErrorTolerance to get simplification in flat areas for free.
LOD1
Mode = Derive ScreenSize from Error
ErrorTolerance = 4.0
PixelError = 8
MaxTrianglesFraction = 0.5 // force at least 2× reduction
MinTrianglesFraction = 0.05
LOD2
LOD0是源。 LOD1和LOD2设置误差预算,激活屏幕尺寸由实际达到的偏差决定。 LOD3进入低成本仅保留模式,适用于最小、远距离LOD,在这种情况下误差指标不值得调优。
其他字段
EdgeLength- 限制任何保留边的最大边长。 在后续处理阶段(光照、UV)需要最低曲面细分密度时非常有用。ScaleCorrection- 属性权重已针对道具缩放资产设为默认值。 该缩放因子可适配大规模地形,并相应地提高属性权重。 如果发现属性伪影,则降低该值,以适配更小尺寸的网格体。MeshRegularization- 小正值;如果平坦区域出现有噪点的折叠,则增加此值。Simplification|Advanced权重 - 保持默认值,除非某个特定属性(法线、UV、颜色、权重层)明显降级。 权重重新平衡属性感知二次曲面。 提高某个属性的权重可以更好地保留该属性,但会牺牲几何体。
诊断结果
构建完成后,每个LOD都会记录到LogMegaMeshEditor中,例如:
LOD1 simplified: 240000 -> 60012 tris (25.0% retained), ErrorTolerance=1.000000, achieved MaxDeviation symmetric=0.974 one-sided=0.812LOD1 ScreenSize=0.512 (source: auto, calculated (from actual geometric deviation and PixelError): 0.512)Achieved MaxDeviation远小于ErrorTolerance- 三角形分数限制产生约束。 提高MaxTrianglesFraction或降低MinTrianglesFraction。`
Achieved MaxDeviation远大于ErrorTolerance-MaxTrianglesFraction正在强制执行超出预算的折叠。 要么接受(你已显式限定三角形数量),要么提高MaxTrianglesFraction。对称远大于单侧 - 一侧完全缺少某一特征。 检查属性权重或降低LOD的简化力度。
预期为
auto时,ScreenSize日志中显示Source: manual- 设置了一个过时的ScreenSize,并且未被你的模式覆盖。 要么清除,要么切换为AutoScreenSizeFromError。
构建网格体分段运行时分段
设置好网格体分段定义构建变体后,你可以从“构建(Build)”菜单/“构建网格体分段(Build Mesh Partition)”选项手动构建已编译分段。
显示网格体分段已编译分段
大纲视图默认隐藏基础和已编译分段。要设为显示,可在大纲视图的筛选菜单中切换为显示:
显示网格体分段基础
显示构建网格体分段分段
网格体分段Actor下将显示这些分段。