OpenGL缓冲区。 Stride vs紧凑的包装

时间:2013-07-15 17:37:13

标签: opengl vertex-buffer vertex-attributes vertexdata

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

Stride:xyzrgb xyzrgb xyzrgb

紧:xyzxyzxyz rgbrgbrgb

乍一看,使用stride时可能很容易改变大小,但是当你用glBufferData重新分配它时,顶点缓冲区的内容会被删除。

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

使用交错缓冲区(stride)似乎很常见。这是为什么?我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

我认为有一个交错缓冲区是很常见的,因为这更容易创建(涉及更少的缓冲区,更直观),并且据说更快(因为内存访问模式或类似的东西),紧密打包的一大优势是能够仅更新您需要更新的数据,从而加快更新速度。大多数OpenGL教程通过绘制静态网格来教授VBO,这些网格不需要更新,因此可以从交错数据中获益。

一般意见似乎是:尽可能地交错,在需要时分开。

请参阅: How does interleaved vertex submission help performance?

并且:Performance gain using interleaved attribute arrays in OpenGL4.0

另见: http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

直接指出:

“有多少交错属性对渲染性能的帮助不太明白。需要分析数据。由于对齐需要,交错顶点数据可能占用比非交错更多的空间。”