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

Modifying only a specific element type of VBO buffer data?

本文关键字:元素 类型 数据 修改 VBO 缓冲区      更新时间:2023-10-16

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

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

您可以使用glMapBufferRange将VBO的特定范围映射到用户内存中。当然,如果你的顶点、颜色和文本数据是交错的,它将相当于一个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]

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

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

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