在OpenGL中使用GL_ARRAY_BUFFER创建索引缓冲区和使用GL_ELEMENT_ARRAY_BUFFER创建索引缓冲区之间有什么区别吗?

问题描述

一段时间以来,我一直在研究OpenGL,现在发现在创建索引缓冲区时,如果将其绑定到GL_ARRAY_BUFFER而不是{{ 1}}(显然)具有相同的结果。

我的意思是,顶点缓冲区始终绑定到GL_ELEMENT_ARRAY_BUFFER,但是如果我创建像这样的索引缓冲区:

GL_ARRAY_BUFFER

然后,例如在绘制几何图形时,我将其绑定到glCreateBuffers(1,&m_BufferID); glBindBuffer(GL_ARRAY_BUFFER,m_BufferID); glBufferData(GL_ARRAY_BUFFER,count * sizeof(uint),vertices,GL_STATIC_DRAW); 上,就可以正常工作,而且我不知道为什么我也认为必须使用GL_ELEMENT_ARRAY_BUFFER创建索引缓冲区,但是……实际上有什么“内在”差异吗?

解决方法

就缓冲对象本身的性质而言?否。所有缓冲区对象都是相同的,并且可以用于适合缓冲区对象的任何任务。缓冲区对象不具有最初用于绑定的特殊属性。

但是,GL_ELEMENT_ARRAY_BUFFER绑定点本身有点不寻常。它不是全局上下文状态的一部分;这是VAO州的一部分。因此,如果没有VAO绑定(在核心配置文件上下文下),则无法将任何内容绑定到该绑定点。当您绑定到该绑定点时,将影响当前绑定的VAO的状态。而且,如果更改当前绑定的VAO,将更改绑定到元素数组绑定点的缓冲区。

因此,通常,只有在打算要做的就是将缓冲区附加到当前绑定的VAO上时,才应绑定到该点。

,

是的。尽管ARRAY_BUFFER绑定是全局状态,但是ELEMENT_ARRAY_BUFFER绑定在“顶点数组对象”中声明。参见Index buffers
因此,glBindBuffer(GL_ELEMENT_ARRAY_BUFFER m_BufferID)会更改当前绑定的“顶点数组对象”中的状态。

请注意,与index bufferELEMENT_ARRAY_BUFFER)相比,vertex buffer绑定(ARRAY_BUFFER)是全局状态。
在VAO状态向量中陈述的每个属性可以引用不同的ARRAY_BUFFER。调用glVertexAttribPointer时将存储此引用。然后,当前绑定到目标ARRAY_BUFFER的缓冲区与指定的属性索引关联,并且对象的名称(值)存储在当前绑定的VAO的状态向量中。
但是,索引缓冲区是VAO的状态。如果将缓冲区绑定到目标ELEMENT_ARRAY_BUFFER,则会将该缓冲区分配给当前绑定的“顶点数组对象”。