C++ 是否仅修改VBO缓冲区数据的特定元素类型?
我有我的VBO目前使用单缓冲区,它有顶点,texcoord和颜色元素C++ 是否仅修改VBO缓冲区数据的特定元素类型?,c++,opengl,vbo,C++,Opengl,Vbo,我有我的VBO目前使用单缓冲区,它有顶点,texcoord和颜色元素 现在,是否可以只高效地更新texcoords而不更新顶点/颜色?它的效率应该与更新单独的缓冲区相同。您可以使用将VBO的特定范围映射到用户内存中。当然,如果顶点、颜色和texcoord数据是交错的,那么它将相当于一个 编辑: 如果您的VBO是: [XYZ XYZ XYZ XYZ RGBA RGBA RGBA RGBA TxTy TxTy TxTy TxTy] 通过映射缓冲区的最后一部分([TxTy-TxTy-TxTy-TxT
现在,是否可以只高效地更新texcoords而不更新顶点/颜色?它的效率应该与更新单独的缓冲区相同。您可以使用将VBO的特定范围映射到用户内存中。当然,如果顶点、颜色和texcoord数据是交错的,那么它将相当于一个 编辑: 如果您的VBO是:
[XYZ XYZ XYZ XYZ RGBA RGBA RGBA RGBA TxTy TxTy TxTy TxTy]
通过映射缓冲区的最后一部分([TxTy-TxTy-TxTy-TxTy]
)并对其进行更新,只能上载纹理坐标。您也可以使用来完成此操作。更新该缓冲区比更新完整缓冲区更快
但如果使用交错数据:
[XYZ RGBA TxTy XYZ RGBA TxTy XYZ RGBA TxTy XYZ RGBA TxTy]
然后无法更新部分缓冲区。您可以将VBO映射到内存空间,然后跨数据并修改它来更新texcoords 一个缺点是,整个VBO一旦修改,将需要重新发送到视频内存进行渲染;如果经常修改,总线带宽可能会成为一个问题
如果您试图对texcoords进行某种算法修改,您可能可以在着色器中进行此计算。另一个选项是在CPU端组成一个新值数组,将这些值发送到着色器,并在渲染时进行重放;不过,使用此选项,您最好首先将texcoords从原始VBO中排除。我将制作动画、位置更改和照明,我不能使用着色器,因为我希望它也能在垃圾硬件上工作。因此,答案是我只能发送我修改过的X类型的元素,例如texcoords?这将与使用多个缓冲区一样快,或者更快?如何使用格式为“XYZ XYZ XYZ RGBA RGBA RGBA TxTy TxTy TxTy TxTy TxTy”的数据?或者只需告诉我称为as和i的方法是什么:)