OpenGL缓冲区-步幅与紧密包装

bof*_*jas 3 opengl vertex-buffer vertexdata vertex-attributes

对于每个属性,使用跨步顶点缓冲区与紧密打包缓冲区有什么优缺点?我的意思是例如:

步幅: xyzrgb xyzrgb xyzrgb

紧: xyzxyzxyz rgbrgbrgb

乍一看,您看起来很容易在使用跨步时更改大小,但是当您使用进行重新分配时,顶点缓冲区的内容将被删除glBufferData()

对我来说,最好使用紧密模型,因为位置,颜色和texcoords可能来自本地内存中的不同数组,并且因为没有跨步缓冲区数据函数;您必须在上传之前将所有数组复制到交错缓冲区中,或者glBufferSubData()每个属性每个顶点使用一个(我猜这是一个糟糕的主意)。

似乎通常使用交错缓冲区(步幅)。这是为什么?我在这里想念什么吗?

小智 5

我认为通常有一个交错的缓冲区,因为它更易于创建(涉及较少的缓冲区,更直观)并且据称更快(由于内存访问模式或类似的东西),紧密打包的最大优点是能够更新仅需要更新的数据,从而可以更快地进行更新。大多数OpenGL教程都是通过绘制静态网格物体来教VBO的,这些网格不需要更新,因此可以受益于交错数据。

一般意见似乎是:尽可能交织,在需要时进行拆分。

请参阅: 交错顶点提交如何帮助提高性能?

并且:在OpenGL4.0中使用交错属性数组可提高性能

另请参阅:http : //www.opengl.org/wiki/Vertex_Specification_Best_Practices

哪个直接说明:

“交织属性对渲染性能有多大帮助尚不清楚。需要分析数据。由于对齐需求,交织的顶点数据可能比未交织的空间占用更多的空间。”