Bevy Mesh Shader 调研
调研日期: 2026-05-13
三层概念
| 层级 | 名称 | 技术本质 | Bevy 现状 |
|---|---|---|---|
| A | GPU Mesh Shader (task/mesh pipeline) | 替代 VS 的新管线,GPU 直接生成几何 | wgpu v28 实验性支持,Bevy 无高层封装 |
| B | Bevy Meshlet (Nanite 风格) | GPU-driven cluster 渲染,compute 做剔除/LOD | 已实验性实现 (bevy#11518) |
| C | SpecializedMeshPipeline | 自定义传统 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 目前没有 MeshPipelineDescriptor 或 draw_mesh_tasks 的高层封装。若要使用,需在 RenderApp 中:
- 写自定义 render graph node
- 直接操作
wgpu::Device创建 mesh pipeline - 自己处理 extract / prepare / queue 阶段
- 手动调用
draw_mesh_tasks()
复杂度类似 custom-render-phase 示例,但需桥接 wgpu mesh API。
B 层: Bevy Meshlet (GPU-driven 几何)
接近 Nanite 的方案,已合并但实验性。
- 跟踪 issue: bevyengine/bevy#11518
- 初始实现: PR #10164 (2024-03)
- 连续 LOD: PR #12755 (2024-04)
原理: 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 大量模型 + 自动 LOD | Bevy Meshlet (#11518) | ⚠️ 实验 |
| 自定义 shader 渲染 mesh | SpecializedMeshPipeline | ✅ 成熟 |
| 程序化生成 mesh | compute_mesh.rs | ✅ 可行 |
Ref URLs
- wgpu mesh shading API spec: https://github.com/gfx-rs/wgpu/blob/trunk/docs/api-specs/mesh_shading.md
- wgpu mesh shader tracking (closed): https://github.com/gfx-rs/wgpu/issues/7197
- wgpu mesh shader example (WGSL + Rust): https://github.com/gfx-rs/wgpu/tree/trunk/examples/features/src/mesh_shader
- Bevy meshlet tracking: https://github.com/bevyengine/bevy/issues/11518
- Bevy specialized mesh pipeline example: https://bevy.org/examples/shaders/specialized-mesh-pipeline/
- Bevy custom render phase example: https://bevy.org/examples/shaders/custom-render-phase/
- Bevy compute mesh example: https://github.com/bevyengine/bevy/blob/main/examples/shader_advanced/compute_mesh.rs
- Bevy rendering architecture (cheatbook, 0.9 旧版): https://bevy-cheatbook.github.io/gpu/intro.html
- wgpu v28 release notes / Reddit 讨论: https://www.reddit.com/r/rust/comments/1ppgxyl/wgpu_v28_released_mesh_shaders_immediates_and/