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

最佳答案

我知道EBO可以绑定到VAO,这与其他OpenGL缓冲区对象不同。


首先,一些术语。

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

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


  我也知道,如果在绑定EBO时没有绑定VAO,则EBO会绑定到OpenGL上下文或全局状态。


这是正确的一半。在兼容性上下文中,VAO 0是默认的VAO对象。即,glBindVertexArray(0)是有效的对象。因此,如果在绑定VAO对象0的情况下调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...),则会将缓冲区附加到VAO 0。

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


  我的问题是,当您将EBO绑定到VAO,然后解除绑定VAO,然后再次绑定EBO时,EBO是绑定到VAO,全局状态还是两者都绑定?


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

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

10-12 04:30