【发布时间】:2018-11-18 02:02:04
【问题描述】:
我试图在这个 hello world 示例 https://github.com/jvm-graphics-labs/hello-triangle/blob/master/src/main/java/gl4/HelloTriangleSimple.java 中替换元素缓冲区的内容,并且我设法通过使用 glBufferSubData 进行了一些小的更改,但我对一个特殊性感到好奇 - 在我的显示方法中在我打电话给glBindVertexArray之前,我必须先打电话给glBufferSubData:
gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT));
elementBuffer.rewind();
elementBuffer.put(elementData).rewind();
gl.glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, elementBuffer.capacity() * Short.BYTES, elementBuffer);
gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindVertexArray(vertexArrayName.get(0));
如果我在glBindVertexArray 之后执行此操作,我只会得到黑色窗口。奇怪的是GL_ARRAY_BUFFER可以在glBindVertexArray之后更新。这个观察背后的顶点缓冲区和元素缓冲区有什么区别?
【问题讨论】:
-
元素数组缓冲区对象的名称存储在顶点数组对象状态向量中。如果绑定了 VAO,并且您执行
gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0),则元素缓冲区对象的名称将替换为 0,并且对元素的引用被破坏。这会导致gl.drawElements不再适用于 VAO。 -
@Rabbid76 这就是答案。如果您将其复制为真实答案,我会将其标记为真实答案。没有的话我自己复制。我已经尝试过了,你说的现在也很明显,但作为一个初学者,我看不到这种联系。但是,我仍然对缓冲区之间的区别感到有些困惑。如果我可以将 0 绑定为 GL_ARRAY_BUFFER 并且绘图仍然有效,这是否意味着它没有从 VAO 中引用?
-
VAO 存储
GL_ELEMENT_ARRAY_BUFFER类型的缓冲区绑定。但它不适用于GL_ARRAY_BUFFER类型,它们由glVertexAttribPointer存储