glBindVertexBuffer vs glBindBuffer

时间:2014-01-16 05:05:00

标签: opengl

我看到我可以使用glBindBuffer(GL_ARRAY_BUFFER, vbo);绑定顶点缓冲区。这有效,我也可以使用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);绑定元素数组。使用这些时,所有内容都会根据需要进行绘制。

在阅读第10.3.1节中的OpenGL 4.4规范时,我发现提到了glBindVertexBuffer。看起来这样可以绑定多个顶点缓冲区,然后让它们一次全部渲染。它是否正确?另外,它与使用glBindBuffer有什么不同?将顶点缓冲区与此绑定时可以使用元素数组缓冲区吗?

2 个答案:

答案 0 :(得分:16)

实际上,glBindVertexBuffer (...)的观点完全不同。

GL_ARB_vertex_attrib_binding中引入的想法是将顶点缓冲区和指针之间始终存在的固定映射分开,并将其替换为允许您设置格式的更灵活的系统用于顶点属性,绑定位置用于要使用的顶点缓冲区/属性,然后简单地换出绑定到该位置的缓冲区。

你不会简单地用这个新函数替换对glBindBuffer (...)的调用,你需要调用至少两个其他函数来设置一个通用顶点属性才能利用{{1} }:

  1. glBindVertexBuffer (...)

    • 这与glVertexAttribFormat (...)实际上是相同的,除了它没有设置指针,它只是确定如何解释将与此属性配对的缓冲区。

  2. glVertexAttribPointer (...)

    • 这会将通用属性位置与 类型的绑定位置(顶点缓冲区绑定)相关联,以便您可以使用glVertexAttribBinding (...)将VBO绑定到此属性将使用的位置。

  3. 为了更好地理解这一点,我在扩展规范中包含了一些伪代码,其中显示了glBindVertexBuffer (...)与此新增API相关的工作原理。

    命令:

    glVertexAttribPointer (...)

    控制顶点属性状态,顶点缓冲区绑定以及顶点属性和顶点缓冲区绑定之间的映射。

    它们相当于(假设没有产生错误):

         void glVertexAttribPointer (GLuint index, GLint size, GLenum type,
                                     GLboolean normalized, GLsizei stride, 
                                     const GLvoid *pointer);
         void glVertexAttribIPointer (GLuint index, GLint size, GLenum type,
                                      GLsizei stride, const GLvoid *pointer);
         void glVertexAttribLPointer (GLuint index, GLint size, GLenum type,
                                      GLsizei stride, const GLvoid *pointer);
    

    首先将头部包裹起来有点困难,但它归结为非常类似于在GL 3.3中引入采样器对象时采样器状态与纹理对象的分离。您可以继续使用旧的API,但这种替代解决方案可以为您提供更大的灵活性。

    关于元素数组缓冲区,没有。 API的这一新部分与此无关,因为顶点数组对象实际上管理了唯一的元素数组缓冲区绑定。

答案 1 :(得分:-2)

不是真的。 glBindVertexBuffers 用于绑定多个顶点缓冲区。至于glBindVertexBuffer,它用于将缓冲区绑定到顶点缓冲区。您可能需要多次调用它来绑定多个顶点缓冲区。

您可以在此处查看其文档: http://www.opengl.org/sdk/docs/man/xhtml/glBindVertexBuffers.xml