我正在编写小型图书馆,以帮助我进行开发。 我正在编写处理VBO的课程。
我的问题是这个。如果我没有OES_vertex_array_object(顶点数组)。 并使用顶点缓冲区对象将数据发送到gpu。我是否必须致电
glEnableVertexAttribArray
glVertexAttribPointer
在每次特定VBO抽奖之前?或者这些属性是否以VBO为基础保存。我打算使用多个VBO,每个都有自己的attribs和着色器。
根据我的理解,如果我有VAO,我可以设置所有这些东西,然后取消绑定VAO,绑定另一个,它将具有之前已设置的特定属性和缓冲区。
答案 0 :(得分:1)
使用glEnableVertexAttribArray()
和glVertexAttribPointer()
设置的状态是不是 VBO的一部分。
VBO(或任何其他类型的缓冲区)只是一个数据容器,没有太多额外的状态。如果你在规范中查找缓冲区对象的状态,它基本上就是:
glBufferData()
的用法值。这意味着每次绑定不同的VBO之后,以及在使用VBO进行第一次绘制调用之前,都必须调用glVertexAttribPointer()
。
glEnableVertexAttribArray()
与当前的VBO绑定无关。因此,如果顶点属性的计数/位置没有改变,则不需要再次调用它。否则,您必须至少启用其他属性,并使用glDisableVertexAttribArray()
禁用以前未使用的属性。
是的,一次又一次地拨打这些电话有点麻烦。这就是为什么VAO被添加为功能的原因。它们跟踪所有这些状态,并允许您通过单个glBindVertexArray()
调用设置整个顶点状态。