我看到我可以使用glBindBuffer(GL_ARRAY_BUFFER, vbo);
绑定顶点缓冲区。这有效,我也可以使用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
绑定元素数组。使用这些时,所有内容都会根据需要进行绘制。
在阅读第10.3.1节中的OpenGL 4.4规范时,我发现提到了glBindVertexBuffer
。看起来这样可以绑定多个顶点缓冲区,然后让它们一次全部渲染。它是否正确?另外,它与使用glBindBuffer
有什么不同?将顶点缓冲区与此绑定时可以使用元素数组缓冲区吗?
答案 0 :(得分:16)
实际上,glBindVertexBuffer (...)
的观点完全不同。
在GL_ARB_vertex_attrib_binding
中引入的想法是将顶点缓冲区和指针之间始终存在的固定映射分开,并将其替换为允许您设置格式的更灵活的系统用于顶点属性,绑定位置用于要使用的顶点缓冲区/属性,然后简单地换出绑定到该位置的缓冲区。
你不会简单地用这个新函数替换对glBindBuffer (...)
的调用,你需要调用至少两个其他函数来设置一个通用顶点属性才能利用{{1} }:
glBindVertexBuffer (...)
glVertexAttribFormat (...)
实际上是相同的,除了它没有设置指针,它只是确定如何解释将与此属性配对的缓冲区。
glVertexAttribPointer (...)
glVertexAttribBinding (...)
将VBO绑定到此属性将使用的位置。为了更好地理解这一点,我在扩展规范中包含了一些伪代码,其中显示了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