小编Mic*_*non的帖子

交错与非交错顶点缓冲区

这似乎是一个 IHV 或另一个 IHV 一直以来都得到解答的问题,但最近我一直试图就顶点布局以及跨所有 IHV 和架构的现代渲染器的最佳实践达成共识。在有人说基准测试之前,我无法轻易做到这一点,因为我无法访问过去 5 年中每个 IHV 和每个架构的卡。因此,我正在寻找一些能够在所有平台上良好运行的最佳实践。

首先,显而易见的是:

  • 将位置与其他属性分开有利于:
    • 阴影和深度预通道
    • 每三角形剔除
    • 基于平铺的延迟渲染器(例如 Apple M1)
  • Interleaved在CPU上逻辑性更强,可以有一个Vertex类。
  • 由于能够利用 SIMD,非交错可以使某些 CPU 计算速度更快。

现在来说说不太明显的事情。

许多人引用 NVIDIA 的话说,您应该始终交错,而且应该对齐到 32 或 64 字节。我还没有找到它的来源,但找到了 NVIDIA 的有关顶点着色器性能的文档,但它已经很旧了(2013 年),并且是关于移动而非桌面的 Tegra GPU。它特别说:

将顶点数据存储为交错的属性流(“结构数组”布局),这样属性的“过度获取”往往会预取可能对后续属性和顶点有用的数据。将属性存储为不同的、非交错的(“数组结构”)流可能会导致内存系统中的“页面抖动”,从而导致性能大幅下降。

快进 3 年到GDC 2016,EA 进行了一次演示,其中提到了应该对顶点缓冲区进行去交错的几个原因。然而,这个建议似乎与 AMD 架构相关,特别是 GCN。虽然他们提出了一个跨平台的案例来分离位置,但他们建议对所有内容进行去交错,并声明这将允许 GPU :

尽快清除缓存行

而且它对于 GCN (AMD) 架构来说是最佳的。

这似乎与我在其他地方听到的说法相冲突,即使用交错以充分利用缓存行。但同样,这与 AMD 无关。

拥有许多不同的 IHV,Intel、NVIDIA、AMD,现在还有 Apple 的 M1 GPU,而且每一个都有许多不同的架构,这让我完全不确定今天应该做什么(没有预算来测试数十个 GPU)。 GPU),以便最好地优化所有架构的性能,而不会导致

结果导致性能大幅下降

在某些架构上。特别是,去交错在 AMD 上仍然是最好的吗?它在 NVIDIA 上不再是问题,还是在桌面 NVIDIA GPU 上从来都不是问题?其他 IHV 又如何呢? …

3d graphics gpu vertex-buffer vertex-attributes

7
推荐指数
0
解决办法
1127
查看次数

标签 统计

3d ×1

gpu ×1

graphics ×1

vertex-attributes ×1

vertex-buffer ×1