OpenGL缓冲区-步幅与紧密压缩

OpenGL缓冲区-步幅与紧密压缩,opengl,vertex-buffer,vertex-attributes,vertexdata,Opengl,Vertex Buffer,Vertex Attributes,Vertexdata,对于每个属性,使用跨步顶点缓冲区与临时压缩缓冲区的优缺点是什么?我的意思是,例如: 步幅:xyzrgb xyzrgb xyzrgb 紧密:xyzxyzxyz rgbrgbrgb 乍一看,使用stride时,您可能很容易更改大小,但使用glBufferData()重新分配顶点缓冲区时,它的内容将被删除 对我来说,似乎最好使用紧模型,因为位置、颜色和texcoords可能来自本地内存中的不同数组,并且因为没有跨步缓冲区数据函数;在上传之前,您必须将所有数组复制到交错缓冲区中,或者在每个属性的每个顶点

对于每个属性,使用跨步顶点缓冲区与临时压缩缓冲区的优缺点是什么?我的意思是,例如:

步幅:
xyzrgb xyzrgb xyzrgb

紧密:
xyzxyzxyz rgbrgbrgb

乍一看,使用stride时,您可能很容易更改大小,但使用
glBufferData()
重新分配顶点缓冲区时,它的内容将被删除

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


使用交错缓冲区(stride)似乎是一种常见的做法。为什么呢?这里我缺少什么?

我认为交错缓冲区很常见,因为它更容易创建(涉及更少的缓冲区,更直观),而且据说速度更快(因为内存访问模式或类似的原因),紧密打包的最大优势是能够只更新需要更新的数据,导致更快的更新。大多数OpenGL教程通过绘制静态网格来教授VBO,静态网格不需要更新,因此受益于交错数据

一般的意见似乎是:尽可能地交织,必要时分开

见:

以及:

另见:

其中直接指出:

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