仅修改特定元素类型的VBO缓冲区数据?

时间:2011-07-13 15:57:45

标签: c++ opengl vbo

我的VBO目前使用单缓冲区,它有顶点,texcoord和颜色元素。

现在,是否有可能只更新texcoords而不更新顶点/颜色?它应该与更新单独缓冲区的效率相同。

2 个答案:

答案 0 :(得分:3)

您可以使用glMapBufferRange将特定范围的VBO映射到用户存储器中。当然,如果你的顶点,颜色和texcoord数据是交错的,它将等同于glMapBuffer

编辑:

如果您的VBO是:

[XYZ XYZ XYZ XYZ RGBA RGBA RGBA RGBA TxTy TxTy TxTy TxTy]

您可以通过映射缓冲区的最后一部分([TxTy TxTy TxTy TxTy])来上传纹理坐标并进行更新。您也可以使用glBufferSubData来执行此操作。更新缓冲区比完整缓冲区更快。

但是如果你使用交错数据:

[XYZ RGBA TxTy XYZ RGBA TxTy XYZ RGBA TxTy XYZ RGBA TxTy]

然后你无法更新部分缓冲区。

答案 1 :(得分:2)

您可以将VBO映射到内存空间,然后通过跨越数据并修改它来更新texcoords。

一个缺点是整个VBO一旦被修改,将需要重新发送到视频内存进行渲染;如果你经常修改它,总线带宽可能会成为一个问题。

如果您尝试对texcoords进行某种算法修改,则可以在着色器中进行此计算。另一个选择是在CPU端组成一个新值的数组,并将这些值发送到着色器并在渲染时进行重新替换;但是,使用此选项,您可能只是首先从原始VBO中排除texcoords。