当您使用交错的 VBO 而不是使用多个 VBO 时,通常会加快速度。
这在使用 VAO 时也有效吗?
因为有一个 VBO 用于位置更方便,一个用于法线等。
您可以在多个 VAO 中使用一个 VBO。
VAO
为了共享更大的数据集,包含单个顶点(属性)数组的专用缓冲区肯定是一种方法,而人们仍然可以在另一个缓冲区中交错特定数组并使用 VAO 组合它们。 VAO 处理所有这些缓冲区和顶点(属性)数组状态的绑定(bind),例如数组缓冲区绑定(bind)和带有(缓冲区)指针和启用/禁用标志的属性条目。除了方便之外,它还旨在快速完成这项工作,更不用说简单的 API 调用了,它可以一次更改所有状态,而无需繁琐的启用和禁用属性数组。它基本上可以,我们之前必须手动执行的操作。但是,使用我自己的类似 VAO 的实现,我无法测量任何性能损失,即使在进行大量绑定(bind)时也是如此。从我的角度来看,主要优点是它的方便。 因此,VAO 不会根据 glDraw* 决定绘图性能,但它会对状态更改的开销产生影响。
交错数据格式... ...减少 GPU 缓存压力,因为单个顶点的顶点坐标和属性不会分散在内存中。它们连续地适合几个缓存行,而分散的属性可能会导致更多的缓存更新并因此被驱逐。最坏的情况可能是每个缓存行一次一个(属性)元素,因为内存位置很远,而顶点以非确定性/非连续方式被拉取,可能没有预测和预取作用。GPU 非常在这件事上类似于 CPU。 ...对于满足不推荐使用的 interleaved formats 的各种外部格式也非常有用,其中兼容数据源的数据集可以直接读入映射的 GPU 内存。正是出于这些原因,我最终用当前的 API 重新实现了这些交错格式。 ...应该像简单的数组一样布局对齐友好。混合具有不同大小/对齐要求的各种数据类型可能需要填充以对 GPU 和 CPU 友好。这是我所知道的唯一缺点,除了更困难的实现。 ...不要阻止您指向其中的单个属性数组进行共享。 交错很可能会提高绘制性能。
结论:根据我的经验,最好为顶点数据源和“编译”的 VAO 设计干净的接口(interface),这样可以适本地封装 VAO 工厂。然后可以更改此工厂以从数据源初始化交错、分离或混合的顶点缓冲区布局,而不会破坏任何内容。这对于分析特别有用。
经过这么多唠叨,我的建议很简单:在优化之前和优化之前进行适当且充分抽象的设计。