1

I use glVertexAttribPointer to load my vertex data each frame(~242kb) it takes about 8ms.
Will I gain any performance increase by employing VBO?
I think the answer is NO since I still have to load whole data.
The only way it can get performance gain is if glBufferData loads data faster than glVertexAttribPointer
Is this is the case?

4

1 回答 1

2

如果您有静态顶点数据,那么 VBO 具有非常明显的性能优势,因为数据保存在 GPU 可访问内存中。

当您在没有 VBO 的情况下使用 glVertexAttribPointer 时,驱动程序必须每帧将您的顶点数据复制到 GPU 可访问内存。客户端数组需要复制的原因有两个

  1. GPU 无法访问您的所有内存。它只能看到 GPU 驱动程序映射到它的页面。
  2. OpenGL 承诺您可以在 glDraw* 返回后自由更改客户端数组内存,但 GPU 渲染在返回后异步发生。

VBO 数据由驱动程序分配并映射到 GPU。如果您保留相同的顶点数据,则可以避免复制。如果您只使用 glBufferSubData 更新顶点数组的一部分,也可以优化更新。(例如,只更新纹理坐标而不更新顶点位置)

于 2016-10-27T14:57:30.833 回答