【问题标题】:How can I change data in a VBO?如何更改 VBO 中的数据?
【发布时间】:2015-07-15 15:55:53
【问题描述】:

我正在尝试使用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 不会绑定到其他任何东西。

【问题讨论】:

  • 这个问题没有错,但它相当专业。不久前,我尝试自己做这件事,但失败了。如果没有人回答这个问题并尝试给予更多关注,我会奖励这个问题。另外,您能否更清楚地了解实际行为是什么以及预期行为是什么?
  • 鉴于当前信息,我已尽我所能编辑您的问题。如果有任何问题,请随时编辑。 stackoverflow.com/review/suggested-edits/8820876
  • @Joehot200 很好的编辑,谢谢。也很棒的cmets。
  • glBufferSubData 的第一个参数应该是 GL_ARRAY_BUFFER 而不是 vbo ID。
  • @Alex 是的,这就像做梦一样。非常感谢。

标签: java opengl 3d buffer lwjgl


【解决方案1】:

好的,这里有两件事:

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

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

【讨论】:

  • 我决定赏金这个答案,因为它的投票最多(无论如何它都会自动获得赏金)。享受代表! :)
【解决方案2】:

在我使用 opengl es 2.0 的 android 项目中,我使用以下代码:

...
buffer = ByteBuffer.allocateDirect(vertexCount * vertexDimension * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
...
// Bind to the buffer. Future commands will affect this buffer specifically.
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bindingId);

// Transfer data from client memory to the buffer.
GLES20.glBufferSubData(GLES20.GL_ARRAY_BUFFER, 0, buffer.capacity() * BYTES_PER_FLOAT, buffer);

// IMPORTANT: Unbind from the buffer when we're done with it.
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

代码不完整,但我认为它很清楚。可以看到,bindBufferbufferSubData的第一个参数始终是GLES20.GL_ARRAY_BUFFER

每次我必须修改 VBO 时,我都不会分配新的字节缓冲区。只需我使用以下代码更新本机缓冲区

buffer.put(coords, 0, size).position(0);

然后我使用指定要更新的数据范围的缓冲区子数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多