Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
网格的细节级别(LOD)
与 遮挡剔除 一样,细节级别(LOD)是优化 3D 项目渲染性能的最重要方法之一。
你会在这个页面中学习到:
网格 LOD 如何提高 3D 项目的渲染性能。
如何在 Godot 中设置网格 LOD。
如何衡量网格 LOD 在项目中的效果(如果达不到预期效果,还可以探索其他方法)。
参见
你可以通过遮挡剔除与网格 LOD 演示项目观察到网格 LOD 的工作原理。
介绍
从历史上看,3D 游戏中的细节层次包括手动绘制几何密度较低的网格,然后配置距离阈值,在距离阈值上绘制这些细节较低的网格。如今,当需要加强控制时,这种方法仍在使用。
然而,在拥有大量详细 3D 资产的项目中,手动设置 LOD 可能是一个非常耗时的过程。因此,自动网格细分和 LOD 配置越来越受欢迎。
Godot 提供了一种方法,可以在导入时自动生成细节较少的网格供 LOD 使用,然后在需要时自动使用这些 LOD 网格。这对用户完全透明。meshoptimizer 库用于幕后的 LOD 网格生成。
网格 LOD 适用于任何绘制 3D 网格的节点。这包括 MeshInstance3D、MultiMeshInstance3D、GPUParticles3D 和 CPUParticles3D。
视觉对比
以下是导入时生成 LOD 网格的示例。当摄像机远离物体时,将使用细节较少的网格:
从最详细(左)到最不详细(右),阴影视图
这是使用线框渲染的同一张图像,以使细分更容易被看到:
从最详细(左)到最不详细(右),线框视图
参见
如果你需要使用艺术家创建的网格手动配置细节层次,请使用 可见范围(HLOD) 而不是自动网格 LOD。
生成网格 LOD
默认情况下,导入的 3D 场景(glTF、.blend、Collada、FBX)会自动生成网格 LOD。生成 LOD 网格后,将在渲染场景时自动使用它们。你无需手动配置任何内容。
然而,对于导入的 3D 网格(OBJ),网格 LOD 生成不会自动启动。这是因为 OBJ 文件默认情况下不作为完整的 3D 场景导入,而仅作为单独的网格资源加载到MeshInstance3D 节点(或 GPUParticles3D、CPUParticles3D...)。
为了使 OBJ 文件具有为其生成的网格 LOD,在文件系统面板中选择它,前往导入面板,将其导入为选项更改为场景,然后单击重新导入:
在导入面板中更改 OBJ 文件的导入类型
单击重新导入后重新启动编辑器。
备注
网格 LOD 生成过程并不完美,偶尔可能会出现渲染问题(尤其是在蒙皮网格中)。在复杂网格上生成网格 LOD 也可能需要一段时间。
如果网格 LOD 导致特定网格看起来已被损坏,则可以在导入面板中禁用该网格的 LOD 生成。这也将加快资源导入的速度。这可以在 3D 场景的导入选项中全局执行,也可以使用“高级导入设置”对话框针对每个网格单独设置。
详见导入 3D 场景。
比较网格 LOD 视觉效果和性能
要在编辑器中禁用网格 LOD 以进行比较,请使用 禁用网格 LOD 高级调试绘制模式。这可以使用 3D 视口左上角的菜单来完成(标记为透视或正交,具体取决于相机模式):
在 3D 视口左上角的菜单中禁用网格 LOD
在同一菜单中启用查看帧时间以查看右上角的 FPS。同时在同一菜单中启用 查看信息,以在右下角查看渲染图元(顶点 + 索引)的数量。
如果网格 LOD 在场景中正常工作,并且相机离网格足够远,你应该会注意到当网格 LOD 处于启用状态时,绘制图元的数量会减少,而 FPS 会增加(除非 CPU 是瓶颈)。
若要实时查看网格 LOD 减面的效果,请在上面指定的菜单中将调试绘制模式更改为显示线框,然后调整渲染 > 网格 LOD > LOD 更改 > 阈值像素项目设置。
配置网格 LOD 性能和质量
你可以通过更改 渲染 > 网格 LOD > LOD 更改 > 阈值像素 项目设置来调整根视口中网格 LOD 过渡的激进程度。要在运行时更改此值,请在根视口上设置 mesh_lod_threshold,如下所示:
get_tree().root.mesh_lod_threshold = 4.0
GetTree().Root.MeshLodThreshold = 4.0f;
每个视口都有自己的 mesh_lod_threshold 属性,可以独立于其他视口进行设置。
默认的网格 LOD 阈值为 1 像素,此值经过调整以实现感知上的无损效果;它可以在质量损失难以察觉的前提下显著提升性能。更高的值会使相机远离时 LOD 更早切换,从而带来更高性能,但画面质量会降低。
如果需要对网格 LOD 进行逐对象调整,可以通过调整继承自 GeometryInstance3D 的任何节点上的 LOD Bias 属性来调整 LOD 过渡的激进程度。高于 1.0 的值会使 LOD 转换比通常更晚发生(更高质量,但性能更低)。低于 1.0 的值会使 LOD 转换比通常更早发生(更低质量,但性能更高)。
此外,ReflectionProbe 节点具有自己的 Mesh LOD Threshold 属性,可在反射探针更新时调整该属性以提高渲染性能。这对于使用 Always 更新模式的 ReflectionProbe 尤为重要。
备注
渲染场景时,网格 LOD 使用屏幕空间度量。这意味着它会自动考虑摄像机视野和视口分辨率。更高的摄像机 FOV 和更低的视口分辨率将使 LOD 选择更加激进;当摄像机远离时,引擎会更早显示减面的模型。
因此,与可见范围(HLOD)不同,你无需在项目中执行任何特殊处理来考虑相机 FOV 和视口分辨率的影响。
将网格 LOD 与 MultiMesh 和粒子结合使用
For LOD selection, the point of the node's AABB that is the closest to the camera is used as a basis. This applies to any kind of mesh LOD (including for individual MeshInstance3D)s, but this has some implications for nodes that display multiple meshes at once, such as MultiMeshInstance3D, CPUParticles3D, and GPUParticles3D. Most importantly, this means that all instances will be drawn with the same LOD level at a given time.
如果你发现 GPUParticles3D 的 LOD 选择不正确,请确保通过选择 GPUParticles3D 节点并使用 3D 视口顶部的 GPUParticles3D > 生成 AABB 来配置节点的可见性 AABB。
如果 MultiMesh 中的实例彼此距离较远,则应将它们放置在单独的 MultiMeshInstance3D 节点中。这样做还可以提高渲染性能,因为视锥体和遮挡剔除将能够剔除单个节点(而它们无法剔除 MultiMesh 中的单个实例)。