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