在实时渲染三维场景时,同一模型如果始终使用最高精度的网格,会带来极大的顶点和三角形处理压力。LOD(Level of Detail)的核心思想是根据模型到摄像机的距离或屏幕占比,动态切换不同精度的网格版本。距离近时使用高模,距离远时使用低模,这样可以在视觉损失很小的前提下,显著降低GPU的顶点变换和光栅化开销。传统 LOD 资产大多由美术手工制作或使用几何简化算法自动生成,而近年来 AI 方法开始进入这一领域,通过学习网格的视觉重要性和结构特征,生成更符合感知质量的多级细节模型。

AI 生成 LOD 并不是要完全取代传统方法,而是弥补传统几何简化在感知质量上的不足。接下来本文将从 LOD 的基础原理、AI 核心思路、具体实现以及工程落地几个方面展开。
一、LOD 的传统原理与几何简化
LOD 技术的前提是远处物体在屏幕上占据的像素很少,细节即使丢失也难以被肉眼察觉。为了让同一个模型有多种精度版本,传统做法包括手工简化、自动简化和混合方式。手工简化可以保留最关键的结构,但耗时且依赖经验;自动简化则通过算法快速生成多个 LOD 层级,应用更广泛。
最常用的自动简化算法是基于二次误差度量(QEM)的边折叠方法。它的目标是在每条边上计算一个折叠代价,即把这条边的两个顶点合并成一个顶点后,模型表面与原始表面之间的几何误差。QEM 使用二次型矩阵来近似每个顶点到相邻三角面的距离平方和,每次选择误差最小的边进行折叠,重复执行直到面数降到目标值。该算法效率高、稳定性好,在许多三维引擎和工具中都被采用。
def qem_simplify(mesh, target_faces):
while len(mesh.faces) > target_faces:
errors = compute_edge_collapse_errors(mesh)
edge = min(errors, key=errors.get)
collapse_edge(mesh, edge)
return mesh
除了边折叠,顶点聚类和网格重采样也属于常见思路。顶点聚类把空间划分为规则网格,落入同一格子的顶点合并,速度极快但会丢失边界清晰度。边折叠类算法则是目前质量和速度平衡最好的方案,它会优先合并平坦区域或曲率变化小的边,但传统方法只看几何误差,无法识别哪些区域在视觉上更重要,比如角色面部、文字标识或特征轮廓。AI 方法正是针对这一问题提供了新的解决思路。
二、AI 生成 LOD 的核心思路
AI 生成 LOD 的基本思路是让模型学习从高模到低模的映射,或者学习每个网格元素的重要性权重。与 QEM 只依赖局部几何误差不同,AI 方法可以引入更大范围的上下文信息,例如曲面邻域、材质边界、纹理细节甚至语义标签,从而在简化时更好地保留视觉关键特征。
一种主流路线是把网格看作图结构,使用图神经网络(GNN)进行边分类或顶点回归。网格的顶点是图的节点,边是图中的连接。通过在网格上定义卷积操作,网络可以提取每个顶点或每条边的局部几何特征。MeshCNN 就是这类方法的代表,它在网格边上应用卷积,并能够输出每条边是否应当被折叠的概率。训练时使用高模和已经简化好的低模作为监督信号,让网络学会哪些边折叠后视觉损失最小。
另一种路线是神经隐式表示。像神经距离场或神经辐射场可以表示连续的三维表面,通过改变网络容量或采样密度,自然获得不同精度的几何。点云自编码器也常用于生成不同细节层级的点云,再通过曲面重建获得网格。这类方法适合需要连续 LOD 或多分辨率表示的场景,但推理速度通常比基于网格的图网络更慢,更适合离线生成。
与传统简化算法相比,AI 方法的主要优势在于感知质量:它可以在相同面数预算下保留更多视觉信息。代价是需要训练数据和额外计算。对于静态资产,可以在构建阶段离线生成多个 LOD 层级;对于动态生成或程序化内容,则需要模型推理速度足够快。
三、生成方法实例:基于边折叠预测的 AI 简化
下面以基于 MeshCNN 的边折叠预测为例,说明生成 LOD 的具体流程。首先是数据准备:收集一批高模网格和对应的低模简化结果,记录高模中哪些边在简化过程中被折叠。可以从高模随机或按规则生成多个低模层级,将每组边标记为折叠或保留,形成训练样本。
模型输入是每条边的特征向量,典型特征包括边的二面角、边长、两端顶点曲率以及相邻面面积等。网络通过多层网格卷积聚合邻域信息,最后输出一个 0 到 1 之间的保留概率。训练时使用二元交叉熵损失,让网络逼近真实折叠标签。
import torch
import torch.nn as nn
class EdgeSimplifyNet(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = MeshConv(5, 32)
self.conv2 = MeshConv(32, 64)
self.fc = nn.Linear(64, 1)
def forward(self, x, edge_index):
x = torch.relu(self.conv1(x, edge_index))
x = torch.relu(self.conv2(x, edge_index))
x = x.mean(dim=1)
return torch.sigmoid(self.fc(x))
model = EdgeSimplifyNet()
# edge_features 形状为 (E, 5),表示每条边的几何特征
# edge_index 表示网格中的边连接关系
scores = model(edge_features, edge_index)
推理阶段,先将高模转为边特征和图结构,输入网络得到所有边的保留概率。按概率从低到高排序,依次折叠概率最低的边,并在折叠后更新局部网格和对应特征。每折叠一定数量的边,就可以输出一个中间 LOD 层级,形成从高模到低模的连续 LOD 链。这种方式比一次性简化更灵活,可以根据目标平台的面数上限控制层级数量。
需要注意的是,折叠一条边后,相邻边的拓扑和几何都会发生变化,因此实际工程中需要逐步更新图结构和边特征。如果直接使用静态图一次性推理所有边概率,可能会产生局部过度简化或拓扑错误。为此,一些框架会采用迭代式推理,每次折叠少量边后重新计算特征,但这样会增加推理时间。对于离线生成,可以采用批量推理加后处理约束来平衡效率。
四、AI LOD 在项目中的落地与注意事项
在实际项目中,AI 生成的 LOD 资产通常作为离线流程的一部分。开发团队可以在模型导入管线中加入 AI 简化步骤,自动为每个静态网格生成多个精度版本,然后交给引擎的 LOD 系统使用。Unity 和 Unreal 等主流引擎都支持导入多个 LOD 层级,并根据屏幕占比自动切换,AI 生成的网格可以直接替换传统手工简化结果。
一个常见问题是属性保持。网格简化不仅涉及顶点位置,还需要处理 UV、法线、切线、顶点色和蒙皮权重。如果只以几何误差为优化目标,材质边界可能出现拉伸或错位。AI 方法可以在损失函数中加入 UV 扭曲和法线变化项,或者将纹理坐标作为特征输入网络,让网络学习在折叠时优先保护纹理连续性。对于角色模型,蒙皮权重的保持更为关键,可以在训练样本中引入蒙皮后的形变误差。
性能方面,AI 简化模型通常在 GPU 上运行,对单个模型的处理时间可能从几十毫秒到几秒不等。对于大型开放世界或需要即时生成的场景,建议将 AI 简化放在资产构建阶段,而不是运行时调用。移动端或 Web 端更应使用预烘焙好的 LOD 层级,避免额外的推理开销。未来随着神经渲染和虚拟几何技术发展,AI 生成 LOD 有可能与 GPU 驱动的细节层级系统进一步融合,在运行时根据像素误差动态生成更合适的几何表示。