首页 > 解决方案 > 在 OpenGL 中使用 GL_ARRAY_BUFFER 创建索引缓冲区和使用 GL_ELEMENT_ARRAY_BUFFER 创建索引缓冲区之间有什么区别吗?

问题描述

我一直在研究 OpenGL,现在,在一个项目上工作时,我发现,当我创建一个索引缓冲区时,如果我将它绑定到 aGL_ARRAY_BUFFER而不是 aGL_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);

然后,例如,在绘制几何图形时,我将它绑定到 a GL_ELEMENT_ARRAY_BUFFER,工作得很好,我不知道为什么我认为索引缓冲区也必须创建GL_ELEMENT_ARRAY_BUFFER,但是......实际上是否有任何“内部”差异?

标签: openglgraphicsopengl-3opengl-4

解决方案


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

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

因此,一般来说,如果您打算将缓冲区附加到当前绑定的 VAO,则应该只绑定到该点。


推荐阅读