Opengl 为什么必须在glBindVertexArray之外调用元素缓冲区的glBufferSubData?
在这个hello world示例中,我试图替换元素缓冲区的内容,并通过使用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
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