Bevy Mesh Shader 调研

调研日期: 2026-05-13

三层概念

层级名称技术本质Bevy 现状
AGPU Mesh Shader (task/mesh pipeline)替代 VS 的新管线,GPU 直接生成几何wgpu v28 实验性支持,Bevy 无高层封装
BBevy Meshlet (Nanite 风格)GPU-driven cluster 渲染,compute 做剔除/LOD已实验性实现 (bevy#11518)
CSpecializedMeshPipeline自定义传统 mesh 管线(仍是 VS/FS)成熟,有官方示例

A 层: True Mesh Shader (wgpu v28)

wgpu v28 已发布实验性 mesh shader 支持,tracking issue #7197 已关闭。

关键 Feature

  • Features::EXPERIMENTAL_MESH_SHADER — 必须启用
  • 后端: Vulkan ✅、DX12 ✅、Metal ✅ (2025-11 PR#8139 合并)
  • 对应 limits: using_recommended_minimum_mesh_shader_values()

WGSL 新语法

启用扩展: enable wgpu_mesh_shader;

  • @task + @payload(...) — task shader,决定向 mesh shader 分发多少 workgroup
  • @mesh(mesh_output) — mesh shader,直接输出 vertices / primitives / vertex_count / primitive_count
  • @per_primitive @location(N) — 逐图元数据传给 fragment shader (flat)
  • @builtin(cull_primitive) — 图元剔除标记
  • @builtin(mesh_task_size) — task shader 返回值,控制 mesh workgroup 分发规模
  • @builtin(triangle_indices) — 图元顶点索引

Rust 管线创建

使用 device.create_mesh_pipeline(&wgpu::MeshPipelineDescriptor { task, mesh, fragment, .. }) 替代传统 render pipeline。 绘制调用 rpass.draw_mesh_tasks(x, y, z)忽略 vertex / index buffer 绑定。

在 Bevy 中使用

Bevy 目前没有 MeshPipelineDescriptordraw_mesh_tasks 的高层封装。若要使用,需在 RenderApp 中:

  1. 写自定义 render graph node
  2. 直接操作 wgpu::Device 创建 mesh pipeline
  3. 自己处理 extract / prepare / queue 阶段
  4. 手动调用 draw_mesh_tasks()

复杂度类似 custom-render-phase 示例,但需桥接 wgpu mesh API。


B 层: Bevy Meshlet (GPU-driven 几何)

接近 Nanite 的方案,已合并但实验性。

原理: mesh 拆分为 meshlet cluster,compute shader 做视锥剔除、遮挡剔除、LOD 选择。 注意: 这是 compute + rasterization 混合架构,不是 mesh shader pipeline。

状态: 缺文档,参考源码 bevy_pbr/src/meshlet/。需 asset processor 将普通 mesh 转为 meshlet 格式。


C 层: SpecializedMeshPipeline (最成熟自定义路线)

官方示例: bevy.org/examples/shaders/specialized-mesh-pipeline/

实现 SpecializedMeshPipeline trait,自定义 RenderPipelineDescriptor、vertex layout、shader handle。仍是传统 vertex shader 模式。


相关路线: Compute Shader 生成 Mesh

Bevy 示例 compute_mesh.rs:compute shader 直接写入 MeshAllocator slab buffer 生成 mesh。

  • 需开启 MeshAllocatorSettings.extra_buffer_usages = BufferUsages::STORAGE
  • 适合程序化地形、粒子网格

选型建议

需求推荐成熟度
尝鲜 true mesh shader (新管线)Bevy 自定义 render node + 直接 wgpu mesh API⚠️ 实验
GPU-driven 大量模型 + 自动 LODBevy Meshlet (#11518)⚠️ 实验
自定义 shader 渲染 meshSpecializedMeshPipeline✅ 成熟
程序化生成 meshcompute_mesh.rs✅ 可行

Ref URLs