2025年10月21日

底层API上的Mesh Shader和Meshlet支持

在Evergine的最新稳定版本中,我们扩展了引擎内的Shader Model支持。我们已从Shader Model 6.3(上一版本)升级到Shader Model 6.7,这使我们能够在着色器中利用更广泛的指令集。

但本次更新最令人兴奋的部分是,它为在Evergine的底层实现Mesh Shader打开了大门,并提供了一个已在DirectX 12和Vulkan中工作的统一接口。

 

什么是 Mesh Shader?

Mesh Shader 的概念由 NVIDIA 于 2018 年提出,但直到 2020 年才随 DirectX 12 Ultimate 实现,随后不久作为 Vulkan 的扩展实现。

这一新管线提出将可渲染网格划分为称为 meshlet 的小片段,从而支持非常有趣的优化:

  • 更低的内存占用。
  • 更高效的剔除技术(视锥体和遮挡剔除)。
  • 在复杂场景中性能更高,因为 GPU 可以处理数量多得多的网格。

换言之:Mesh Shader 重新思考了几何体在 GPU 上的生成和处理方式,用一种更紧凑、更灵活的流程取代了传统光栅化管线的部分环节。

管线对比

经典光栅化管线包含 3 个固定功能阶段和 5 个可编程阶段,而采用 Mesh Shader 的新管线则简化为 2 个固定功能阶段和 3 个可编程阶段。

像素着色器在两种管线中仍然存在,但关键区别在于几何体生成,其中出现了两个新阶段:

  • Task Shader(在 DX12 中也称为 Amplification Shader,在 Metal 中称为 Object Function)。
  • Mesh Shader(取代并扩展了顶点着色器、几何着色器和外壳着色器的角色)。

 

Evergine 中的实践示例

为了说明其工作原理,在 Evergine 中,你只需要一个 Mesh Shader 和一个像素着色器即可绘制一个三角形。

结果:

Mesh Shader 定义了三个顶点及其位置和颜色,并指定了三角剖分的索引。与传统的顶点着色器、几何着色器和外壳着色器不同,这里我们拥有更大的自由度,包括可以自动将网格细分为 meshlet。

 

什么是 Meshlet?

Meshlet 是一小组顶点和三角形 (理想情况下为 64 个顶点和 126 个三角形),GPU 可以非常高效地处理它们。

为了自动生成这些组,目前有多个库可用,但已成为行业标准的是 MeshOptimizer(由 Arseny Kapoulkine 开发)。

在 Evergine 中,我们为这个库创建了一个 C# 绑定,以 NuGet 包的形式提供,让你可以轻松地将网格细分为 meshlet。

使用我们绑定的示例:

网格细分完成后,着色器可以解包 meshlet 数据并进行最优渲染。

我们从 meshlet 集合渲染网格的 Mesh Shader 如下:

Task Shader:高效剔除

Task Shader 是可选的,但特别有趣,因为它允许我们决定将哪些 meshlet 发送到 Mesh Shader 阶段。

这使得实现 遮挡剔除 技术变得非常容易,仅渲染可见的 meshlet。在包含大量对象的大型场景中,资源节省可能非常显著。

示例:一个 Task Shader,它丢弃屏幕左侧的所有 meshlet,仅渲染右半部分的 meshlet。

演示与开源

采用 Mesh Shader 的新管线已在 Evergine 的底层可用,你可以立即在 DX12 和 Vulkan 中开始试验。

你可以从我们的仓库下载本文所用演示的完整源代码:

Evergine 底层 API 演示

其中还包含了将网格细分为 meshlet 并使用此新管线进行渲染的其他示例。

 

 

结论

Mesh Shader 的到来对 Evergine 而言是非常重要的一步,使其能够充分利用现代 GPU。借助这项技术,你可以更高效地渲染更多几何体,并且还拥有像我们的 MeshOptimizer 绑定这样的工具,可以立即开始使用 meshlet。

 

 

Jorge Canton
作者
Jorge Cantón
Plain Concepts Research