我正在尝试使用 glMapData()
和 glBufferSubData()
方法来修改现有的 VBO。
我当前的代码如下:
public void updateBufferData(int vaoID, int vboID, long index, int value){
GL30.glBindVertexArray(vaoID); //bind VAO
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); //bind VBO
IntBuffer buffer = storeDataInIntBuffer(new int[]{value}); //I'm not sure if I should do it like this?
GL15.glBufferSubData(vboID, index, buffer); //set data
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); //unbind VBO
GL30.glBindVertexArray(0); //unbind VAO
}
然而,当我调用这个方法时,它似乎对 VBO 没有任何影响。渲染的对象仍然是一样的。
我很确定当 updateBufferData()
方法被调用时,VBO/VAO 没有绑定(bind)到任何其他东西。
最佳答案
好的,这里有两件事:
首先,您不需要绑定(bind) VAO 来更新 VBO。一旦您指定 VBO 是 glVertexAttribArrayPointer
的源(您在创建 VAO 时执行此操作),您就不需要再将它们绑定(bind)在一起。对于绘图,您绑定(bind) VAO,对于 VBO 修改,您绑定(bind) VBO。可以这样想:同一个 VBO 可能已绑定(bind)到多个 VAO,因此绑定(bind)特定 VAO 以更新它是没有意义的。
现在开始真正的回答,你做错了 glBufferSubData
调用。它应该使用 GL15.GL_ARRAY_BUFFER
作为第一个参数,而不是 VBO ID,因为它已经绑定(bind)到 GL15.GL_ARRAY_BUFFER
绑定(bind)点。
关于java - 如何更改 VBO 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31435348/