目前我的 VBO 使用单个缓冲区,它有顶点、texcoord 和颜色元素。
现在,是否可以仅有效地更新 texcoords 而无需更新顶点/颜色?它应该与更新单独的缓冲区具有相同的效率。
您可以使用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]
然后你不能更新缓冲区的一部分。
您可以将 VBO 映射到内存空间,然后通过跨越数据并对其进行修改来更新 texcoords。
一个缺点是整个 VBO 修改后,需要重新发送到显存进行渲染;如果您经常对此进行修改,则总线带宽可能会成为一个问题。
如果您尝试对您的 texcoords 进行某种算法修改,您可能会在着色器中进行此计算。另一种选择是在 CPU 端组成一个新值数组,并将这些值发送到着色器并在渲染时进行替换;但是,使用此选项,您不妨首先从原始 VBO 中排除 texcoords。