我的VBO目前使用单缓冲区,它有顶点,texcoord和颜色元素。
现在,是否有可能只更新texcoords而不更新顶点/颜色?它应该与更新单独缓冲区的效率相同。
答案 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。