如何更改 VBO 中的数据?

nau*_*_rs 3 java opengl 3d buffer lwjgl

我正在尝试使用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
}
Run Code Online (Sandbox Code Playgroud)

但是,当我调用此方法时,它似乎对 VBO 没有任何影响。渲染的对象仍然相同。

我很确定在updateBufferData()调用该方法时,VBO/VAO 不会绑定到任何其他内容。

Dan*_*ans 5

好的,这里有两件事:

首先,您不需要绑定 VAO 来更新 VBO。一旦您指定所述 VBO 是glVertexAttribArrayPointer(您在创建 VAO 时执行此操作)的源,您就不再需要将它们绑定在一起。对于绘图,您绑定 VAO,对于 VBO 修改,您绑定 VBO。可以这样想:同一个 VBO 可能已绑定到多个 VAO,因此绑定特定的 VAO 来更新它是没有意义的。

现在进入实际答案,您glBufferSubData打错了电话。它应该GL15.GL_ARRAY_BUFFER用作第一个参数,而不是 VBO ID,因为它已经绑定到GL15.GL_ARRAY_BUFFER绑定点。