glVertexAttribPointer依赖于GL_ARRAY_BUFFER?

时间:2015-06-22 12:01:02

标签: opengl opengl-es

我正在编写小型图书馆,以帮助我进行开发。 我正在编写处理VBO的课程。

我的问题是这个。如果我没有OES_vertex_array_object(顶点数组)。 并使用顶点缓冲区对象将数据发送到gpu。我是否必须致电

glEnableVertexAttribArray 
glVertexAttribPointer 
在每次特定VBO抽奖之前

?或者这些属性是否以VBO为基础保存。我打算使用多个VBO,每个都有自己的attribs和着色器。

根据我的理解,如果我有VAO,我可以设置所有这些东西,然后取消绑定VAO,绑定另一个,它将具有之前已设置的特定属性和缓冲区。

1 个答案:

答案 0 :(得分:1)

使用glEnableVertexAttribArray()glVertexAttribPointer()设置的状态是不是 VBO的一部分。

VBO(或任何其他类型的缓冲区)只是一个数据容器,没有太多额外的状态。如果你在规范中查找缓冲区对象的状态,它基本上就是:

  • 数据本身。
  • 数据的大小。
  • 某些标记,例如传递给glBufferData()用法值。
  • 跟踪缓冲区当前是否已映射的标记,以及描述映射的其他状态(如果已映射)。

这意味着每次绑定不同的VBO之后,以及在使用VBO进行第一次绘制调用之前,都必须调用glVertexAttribPointer()

glEnableVertexAttribArray()与当前的VBO绑定无关。因此,如果顶点属性的计数/位置没有改变,则不需要再次调用它。否则,您必须至少启用其他属性,并使用glDisableVertexAttribArray()禁用以前未使用的属性。

是的,一次又一次地拨打这些电话有点麻烦。这就是为什么VAO被添加为功能的原因。它们跟踪所有这些状态,并允许您通过单个glBindVertexArray()调用设置整个顶点状态。