Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于EBO如何工作的一点说明(元素数组缓冲区)_Java_Opengl_Lwjgl - Fatal编程技术网

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

Java 关于EBO如何工作的一点说明(元素数组缓冲区),java,opengl,lwjgl,Java,Opengl,Lwjgl,我知道EBO可以绑定到VAO,这与其他OpenGL缓冲区对象不同。我还知道,如果绑定EBO时没有绑定VAO,那么EBO将绑定到OpenGL上下文或全局状态。我的问题是,当你将EBO绑定到VAO,然后解除VAO绑定,然后再次绑定EBO时,EBO是绑定到VAO,还是绑定到全球国家,或者两者都绑定?提前感谢您的帮助。来自OpenGL规范: 缓冲区对象是通过将GenBuffers返回的名称绑定到 缓冲区目标。通过调用void[gl]BindBuffer可以实现绑定( 枚举目标,uint缓冲区);目标必须

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

来自OpenGL规范:

缓冲区对象是通过将GenBuffers返回的名称绑定到 缓冲区目标。通过调用void[gl]BindBuffer可以实现绑定( 枚举目标,uint缓冲区);目标必须是列出的目标之一 在表中

Bindind缓冲区描述如何使用它。例如,使用target=
GL\u ELEMENT\u ARRAY\u BUFFER
将缓冲区绑定为EBO

抽屉元素、DrawRangeElements和抽屉元素静态源 它们的索引来自名称绑定到[GL_]元素的缓冲区对象_ 数组缓冲区

因此,使用当前绑定的[elements]缓冲区。 VAO的存储绑定。当您通过
glBindVertexArray
再次“激活”VAO时,EBO将再次“自动”绑定

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

首先是一些术语

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

当您调用
glBindBuffer(GL\u ELEMENT\u ARRAY\u BUFFER,…)
时,您正在将缓冲区附加到当前VAO。是的,我知道函数说的是“bind”,它的行为很像一个常规的上下文绑定点,但是OpenGL函数说了很多愚蠢的事情。DSA等价物之所以被称为
glVertexArrayElementBuffer
,却看不到“bind”,这是有原因的

我还知道,如果绑定EBO时没有绑定VAO,那么EBO将绑定到OpenGL上下文或全局状态

这是半真半假。在兼容性上下文中,VAO 0是默认的VAO对象。也就是说,
glBindVertexArray(0)
是有效的对象。因此,如果在绑定VAO对象0的情况下调用
glBindBuffer(GL\u ELEMENT\u ARRAY\u BUFFER,…)
,则将缓冲区附加到VAO 0

在核心上下文中,不存在VAO 0。因此,
glBindBuffer(GL\u元素\u数组\u缓冲区,…)
将导致
GL\u无效\u操作
错误

我的问题是,当你将EBO绑定到VAO,然后解除VAO绑定,然后再次绑定EBO时,EBO是绑定到VAO,还是绑定到全球国家,或者两者都绑定


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

我知道如何将缓冲区绑定到GL_元素_数组_缓冲区,它“成为一个EBO”。我还知道,如果在绑定“glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,bufferID)”时绑定了VAO,那么绑定会反映在VAOs状态中。我还知道,当我将EBO绑定到VAO,然后解除绑定VAO时,EBO也会解除绑定。我的问题是,如果EBO绑定到VAO,并且VAO未绑定,那么当我使用“glBindBuffer(GL\u ELEMENT\u ARRAY\u buffer,bufferID)”绑定同一个缓冲区时会发生什么。缓冲区将绑定到全局状态、VAO还是两者都绑定?@pdid:“我也知道,当我将EBO绑定到VAO,然后解除绑定VAO时,EBO也将解除绑定。”你还没有真正理解这一部分。将缓冲区对象附加到VAO时,它将附加到VAO,而不是上下文。在这种情况下,如果在未绑定VAO的情况下将缓冲区绑定到元素数组缓冲区会发生什么情况?在这种情况下,如果在未绑定VAO的情况下将缓冲区绑定到GL_元素_缓冲区会发生什么情况?请尝试在设置核心配置文件上下文(非兼容性配置文件)后,在未绑定VAO但绑定EBO的情况下绘制。你会看到的。