Base-Meshlet与MeshShader
一个大网格只有一个包围盒时,即使只露出很小一部分,也可能需要提交整块几何。把网格拆成更小的局部簇,可以在更细粒度上判断可见性和组织处理。
Meshlet 是几何数据组织方式,Mesh Shader 是可编程管线能力,Nanite 则是一整套虚拟几何系统。它们会共享分块与剔除思想,但不应视作同一个功能。
1. Meshlet 里通常有什么
一个 Meshlet 保存一组局部顶点引用与三角形索引,以及用于快速判断的包围体、法线锥等信息。顶点与三角形上限由目标管线和实现策略约束,不是数学固定值。
划分时希望保持空间局部性与顶点复用。块太小会增加元数据和调度开销,块太大又降低剔除效率。只按索引连续切段,未必得到空间紧凑的 Meshlet。
2. 更细粒度的剔除
包围球或 AABB 可以进行视锥测试;法线锥能在满足条件时判断整个簇背向相机;保守的深度层级测试可进一步判断遮挡。
双面材质、大幅顶点变形和透明内容可能改变剔除前提。草的风动画若超出静态包围体,就可能被错误裁掉,必须扩展界限或更新数据。
剔除本身也有成本。场景几乎全部可见时,细粒度测试的收益可能不足以覆盖它的计算、队列与读取成本。
3. Mesh Shader 改变几何生成入口
在支持的 D3D12 Mesh Shader 管线中,可选的 Amplification Shader 组织任务,Mesh Shader 输出供光栅化使用的顶点与图元。其他 API 中相近阶段常使用 Task Shader 这个名称。
它把部分传统固定几何组织工作交给可编程线程组,使局部簇的加载、剔除与输出更容易结合。但像素着色、深度测试和材质成本仍然存在。
一个线程组可以协作处理一个或多个簇,不能说“Meshlet 顶点数必须等于线程数”。如何把顶点和图元分配给线程,属于具体实现。
4. Meshlet 不必等到 Mesh Shader 才能用
Compute Culling 加上传统间接绘制,也可以消费分块后的几何数据。它可能需要组织 Draw 参数、索引范围或其他中间数据,并不拥有与 Mesh Shader 完全相同的输出方式。
因此判断平台是否支持某个 API 能力,与判断分块剔除思路能否落地,是两个问题。跨平台方案往往需要不同后端。
5. Nanite 还多了哪些层次
Nanite 不只是把大网格分块后剔除,还涉及层级细节选择、流送、压缩、可见性和特定光栅化实现。Cluster 之间存在 LOD 组织,而不是一批互相独立的小网格。
这不意味着 VSM、Lumen 或 World Partition 在所有路径上都必须依赖 Nanite。系统之间有优化配合与使用条件,不能把产品宣传中的组合关系写成绝对技术依赖。
6. 如何评估自己的场景
先统计顶点、三角形与实例的屏幕贡献,再比较簇划分后的存储、剔除成本和实际绘制量。模型重用程度、可见比例与材质复杂度都影响结果。
测试至少包含全可见、部分遮挡、快速移动和变形边界。只展示一个遮挡最强的静态镜头,会夸大剔除收益。
总结
Meshlet 提供局部数据块,Mesh Shader 提供更灵活的几何处理入口,Nanite 则在此类思想上组织完整系统。分清数据、管线与系统,才容易选择适合项目的平台路径和粒度。