java - 关于 EBO 如何工作的一些说明(元素数组缓冲区)

标签 java opengl lwjgl

我知道 EBO 可以绑定(bind)到 VAO,这与其他 OpenGL 缓冲区对象不同。我还知道,如果在绑定(bind)EBO时没有绑定(bind)VAO,则EBO将绑定(bind)到OpenGL上下文或全局状态。我的问题是,当您将 EBO 绑定(bind)到 VAO,然后取消绑定(bind) VAO,并再次绑定(bind) EBO 时,EBO 是绑定(bind)到 VAO、全局状态还是两者都绑定(bind)?预先感谢您的帮助。

最佳答案

I understand that a EBO can be bound to a VAO, unlike the other OpenGL buffer objects.

首先,一些术语。

在 OpenGL 中,您不会将一个对象绑定(bind)到另一个对象。您一个对象附加到另一个对象上。 “绑定(bind)”仅在将对象放入上下文中时使用。

当您调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...)时,您将缓冲区附加到当前的VAO。是的,我知道该函数说“绑定(bind)”,并且它的行为很像常规上下文绑定(bind)点,但 OpenGL 函数说了很多愚蠢的事情。 DSA 等效项被称为 glVertexArrayElementBuffer 是有原因的,看不到“绑定(bind)”。

I also know that if no VAO is bound at the time of binding the EBO, the EBO is bound to the OpenGL context or the global state.

这句话只对了一半。在兼容性上下文中,VAO 0 是默认 VAO 对象。也就是说,glBindVertexArray(0) 是一个有效的对象。因此,如果您在绑定(bind)了 VAO 对象 0 的情况下调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...) ,则会将缓冲区附加到 VAO 0。

在核心上下文中,没有 VAO 0。因此,glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...) 将导致 GL_INVALID_OPERATION 错误。

My question is when you bind a EBO to a VAO, then unbind the VAO, and bind the EBO again, is the EBO bound to the VAO, the global state, or both?

缓冲区可以附加到任意数量的 VAO。因此,将缓冲区附加到 VAO 0 的事实不会改变它附加到其他 VAO 的事实。

关于java - 关于 EBO 如何工作的一些说明(元素数组缓冲区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42216267/

相关文章:

java - 从文件中读取 double 值

c++ - OpenGL、立方体贴图、顶点和片段着色器

c++ - 使用 OpenGL C++ 绘制圆

c++ - OpenGL:gluUnProject 的结果不是预期的结果

java - 将eclipse项目导出到jar

java - 如何用LWJGL将图像保存到内存中?

java - 阴影体积实现

java - 从串行端口读取整个消息

java - 在java中检索具有Predicate返回类型的方法的值

java - 如何编码 Stream.findNth()?