我知道 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/