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 不会绑定到任何其他内容。
好的,这里有两件事:
首先,您不需要绑定 VAO 来更新 VBO。一旦您指定所述 VBO 是glVertexAttribArrayPointer(您在创建 VAO 时执行此操作)的源,您就不再需要将它们绑定在一起。对于绘图,您绑定 VAO,对于 VBO 修改,您绑定 VBO。可以这样想:同一个 VBO 可能已绑定到多个 VAO,因此绑定特定的 VAO 来更新它是没有意义的。
现在进入实际答案,您glBufferSubData打错了电话。它应该GL15.GL_ARRAY_BUFFER用作第一个参数,而不是 VBO ID,因为它已经绑定到GL15.GL_ARRAY_BUFFER绑定点。