4

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

步幅:xyzrgb xyzrgb xyzrgb

紧的:xyzxyzxyz rgbrgbrgb

乍一看,使用 stride 时您可以轻松更改大小,但使用glBufferData().

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

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

4

1 回答 1

6

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

普遍的看法似乎是:尽可能交错,需要时拆分。

请参阅: 交错顶点提交对性能有何帮助?

并且:在 OpenGL4.0 中使用交错属性数组获得性能提升

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

其中直接说明:

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

于 2013-07-15T19:35:56.440 回答