Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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
Opengl 为什么必须在glBindVertexArray之外调用元素缓冲区的glBufferSubData?_Opengl_Jogl - Fatal编程技术网

Opengl 为什么必须在glBindVertexArray之外调用元素缓冲区的glBufferSubData?

Opengl 为什么必须在glBindVertexArray之外调用元素缓冲区的glBufferSubData?,opengl,jogl,Opengl,Jogl,在这个hello world示例中,我试图替换元素缓冲区的内容,并通过使用glBufferSubData对其进行了一些小的更改,但我对一个特性感到好奇——在我的显示方法中,我必须在调用glbindertexarray之前调用glBufferSubData: gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT)); elementBuffer.rewind(); elementBuffer.put(eleme

在这个hello world示例中,我试图替换元素缓冲区的内容,并通过使用
glBufferSubData
对其进行了一些小的更改,但我对一个特性感到好奇——在我的显示方法中,我必须在调用
glbindertexarray
之前调用
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\u ARRAY\u BUFFER
可以在
glBindVertexArray
之后更新。观察结果背后的顶点缓冲区和元素缓冲区有什么区别?

GL\u element\u ARRAY\u buffer对象存储在顶点数组对象状态向量中

如果a是绑定的 元素缓冲区可以通过

gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT));
但如果你这样做了

gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
然后,元素缓冲区对象的名称被0替换,对元素的引用被中断。这导致
gl.drawerelements
不再适用于此VAO,因为它不引用任何索引列表


进一步注意,始终存在顶点数组对象。顶点数组对象0是默认的顶点数组对象,仅在使用兼容配置文件上下文(而非核心)时有效

这意味着

gl.glBindVertexArray(0);
gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT));
将元素缓冲区与默认顶点数组对象(0)关联。这在兼容性概要文件上下文中完全有效


见:

顶点数组对象的名称空间是带零的无符号整数, GL保留以表示默认顶点数组对象。 命令

void GenVertexArrays( sizei n, uint *arrays );
void BindVertexArray( uint array );
返回数组中n个以前未使用的顶点数组对象名称

顶点数组对象是通过使用命令绑定
GenVertexArray
返回的名称创建的

void GenVertexArrays( sizei n, uint *arrays );
void BindVertexArray( uint array );
array
是顶点数组对象名称。生成的顶点数组对象是一个新的状态向量,包含所有状态,并具有表23.3和23.4中列出的相同初始值。
BindVertexArray
也可用于绑定现有顶点数组对象。如果绑定成功,则不会对绑定顶点数组对象的状态进行任何更改,并且之前的任何绑定都会被破坏

表23.4,顶点数组对象状态
元素数组缓冲区绑定
顶点数组缓冲区绑定
顶点属性绑定
顶点属性相对偏移
顶点绑定偏移
顶点绑定跨步
顶点绑定除数
顶点绑定缓冲区


元素数组缓冲区对象的名称存储在顶点数组对象状态向量中。如果VAO已绑定,并且您执行了
gl.glBindBuffer(gl\u ELEMENT\u ARRAY\u BUFFER,0)
,则元素缓冲区对象的名称将替换为0,并且对元素的引用被删除。这导致
gl.drawerelements
对VAO不再起作用。@rabbi76这就是答案。如果你复制它作为一个真实的答案,我会标记为这样。如果你不知道,我会自己抄的。我已经试过了,你说的话现在也很明显了,但作为一个乞丐,我看不出其中的联系。然而,我仍然对缓冲区之间的差异感到困惑。如果我可以将0绑定为GL_数组_缓冲区,并且图形仍然可以工作,这是否意味着它没有从VAO引用?VAO存储
GL_元素_数组_缓冲区
类型缓冲区绑定。但它不支持由
glvertexattributepointer