java - 如何更改 VBO 中的数据?

标签 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
}

然而,当我调用这个方法时,它似乎对 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/

相关文章:

c++ - OpenGL + SDL绕局部轴旋转

opengl - openGL 和 GLSL 中的点渲染

javascript - three.js 立方体使用多个纹理的验证

3d - three.js将Object3d绕其中心的Y轴旋转

java - 如何将 ScrollView 添加到我的 xml 中?

AsyncHttpClient 的 java.lang.NoClassDefFoundError - API 19

java - 将 DAY_OF_MONTH 或 DAY_OF_YEAR 添加到 Calendar 对象有什么区别?

opengl - glBufferData 中目标参数的意义是什么

javascript - 简单的 js 添加 3d

java - 如何使用 java Logger 类记录堆栈跟踪