图形/仿真

高级 API 性能:网格着色器

这篇文章介绍了 NVIDIA GPU 上网格着色器的最佳实践。要在应用程序中获得高且一致的帧速率,请参阅所有高级 API 性能提示.

网格着色器是最近添加到编程管道中的一种,旨在克服经典几何管道使用的固定布局的瓶颈。本文介绍了 DirectX 和 Vulkan 开发人员的最佳实践。

Pipeline diagram shows geometry pipeline of 8 steps vs. mesh shader pipeline of 5 steps.
图 1 。网格着色器替代几何体管道

推荐

  • 分割数据时,使用 64 个唯一顶点和 126 个三角形基本体的值,中间甜点为 40 和 84 。这里的重点是组织实现,以便直接使用不同的分段进行实验。
  • 尽可能减少放大和网格着色器中的有效负载大小:
    • 使用位压缩和量化表示
    • 用重心替换属性,并允许像素着色器获取和插值属性
  • 网格和放大着色器阶段为 LoD 选择和进一步剔除策略提供了机会。这些可在不同粒度下实现,例如:
    • 在 AS 阶段:剔除簇或进行管道 LoD 决策
    • 在 MS 阶段:剔除单个原语
  • 如果很简单,可以提前做出决策,并使用应用程序中可用的推断数据。这样可以节省大量的工作。请记住,不需要模拟更复杂的剔除方案,默认情况下,硬件会有效地模拟这些方案。
  • 在处理程序实例化时,依赖放大着色器和网格着色器,例如头发或植被、 iso 曲面(流体模拟、医学成像中的体素数据)、从 3D 扫描获得的资源、 LOD 以及 CAD 应用程序中经常遇到的一般详细模型。
  • 考虑特殊网格的拓扑连通性。与显示稀疏拓扑的网格(如粒子)相比,我有单独的实现来处理密集拓扑。
  • 请注意,放大着色器阶段会增加开销,尽管通常这可以忽略不计。
  • 有关更多信息,请参阅为专业图形使用网格着色器

Vulkan

  • 与 DX 相比,VK_NV_mesh_shader中的网格着色器允许对网格输出进行任意读写访问,这些输出是预先分配的。您可以通过直接使用或重新调整这些输出的用途来获得性能,并避免额外的共享内存分配。

不推荐

  • 避免放大着色器的大输出,因为这会导致严重的性能损失。通常,我们鼓励灵活的实现,允许微调。考虑到这一点,有许多通用因素会影响性能:
    • 有效载荷的大小。 AS 有效负载最好保持在 108 / 236 字节以下。
    • 放大着色器的调用次数。
    • 由相应放大着色器发射的网格着色器数(放大率)。
  • 不要尝试使用放大和网格着色器模拟固定函数管道,因为这可能会增加冗余。
  • 避免在每一帧的新网格中分割,并考虑脱机烘焙这些数据,这允许在空间或顶点重用中优化网格。

致谢

感谢 Jakub Boksansky 的建议和反馈。

 

标签