问题描述
一段时间以来,我一直在研究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 buffer(ELEMENT_ARRAY_BUFFER
)相比,vertex buffer绑定(ARRAY_BUFFER
)是全局状态。
在VAO状态向量中陈述的每个属性可以引用不同的ARRAY_BUFFER
。调用glVertexAttribPointer
时将存储此引用。然后,当前绑定到目标ARRAY_BUFFER
的缓冲区与指定的属性索引关联,并且对象的名称(值)存储在当前绑定的VAO的状态向量中。
但是,索引缓冲区是VAO的状态。如果将缓冲区绑定到目标ELEMENT_ARRAY_BUFFER
,则会将该缓冲区分配给当前绑定的“顶点数组对象”。