glBindVertexBuffer vs glBindBuffer

Gra*_*rak 5 opengl

我看到我可以使用绑定顶点缓冲区glBindBuffer(GL_ARRAY_BUFFER, vbo);.这有效,我也可以使用绑定元素数组glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);.使用这些时,一切都按照需要绘制.

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

And*_*man 16

实际上,重点glBindVertexBuffer (...)是完全不同.

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

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

  1. glVertexAttribFormat (...)

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

  2. glVertexAttribBinding (...)

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

为了glVertexAttribPointer (...)更好地理解这一点,我在扩展规范中包含了一些伪代码,这些伪代码展示了如何与这个新的API添加相关.

命令:

     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);
Run Code Online (Sandbox Code Playgroud)

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

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

     if (no buffer is bound to GL_ARRAY_BUFFER and pointer != NULL) {
       generate GL_INVALID_OPERATION;
     }
     glVertexAttrib*Format (index, size, type, {normalized, }, 0);
     glVertexAttribBinding (index, index);
     if (stride != 0) {
       effectiveStride = stride;
     } else {
       compute effectiveStride based on size/type;
     }
     GL_VERTEX_ATTRIB_ARRAY_STRIDE[index] = stride;
     // GL_VERTEX_BINDING_STRIDE will be set to effectiveStride
     // by glBindVertexBuffer.
     glBindVertexBuffer (index, <buffer bound to GL_ARRAY_BUFFER>, 
                         (GLchar *)pointer - (GLchar *)NULL, effectiveStride);
Run Code Online (Sandbox Code Playgroud)

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

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