我看到我可以使用glBindBuffer(GL_ARRAY_BUFFER, vbo);
绑定顶点缓冲区。这是可行的,我还可以使用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
绑定一个元素数组。当使用这些时,一切都如所愿地绘制。
在阅读第10.3.1节中的OpenGL 4.4规范时,我发现提到了glBindVertexBuffer
。这看起来像是允许绑定多个顶点缓冲区,然后一次渲染所有顶点缓冲区。这样对吗?另外,它与使用glBindBuffer
有什么不同?在绑定顶点缓冲区时,可以使用元素数组缓冲区吗?
2条答案
按热度按时间7dl7o3gd1#
实际上,
glBindVertexBuffer (...)
的意义完全不同。GL_ARB_vertex_attrib_binding
中引入它的想法是分离顶点缓冲区和指针之间一直存在的固定Map,并用一个更灵活的系统来取代它,该系统允许您为顶点属性设置格式,为顶点缓冲区/属性设置绑定位置,然后简单地交换绑定到该位置的缓冲区。您不仅要用这个新函数替换对
glBindBuffer (...)
的调用,还需要调用至少另外两个函数来设置通用顶点属性,以便能够利用glBindVertexBuffer (...)
:1.
glVertexAttribFormat (...)
-这实际上与glVertexAttribPointer (...)
相同,除了它不设置指针,它只是建立如何解释将与该属性配对的缓冲区。1.
glVertexAttribBinding (...)
-将通用属性位置与新的类型的绑定位置(顶点缓冲区绑定)相关联,以便您可以使用glBindVertexBuffer (...)
将您的VBO绑定到此属性将使用的位置。1.
glVertexBindingDivisor (...)
--这是glVertexAttribDivisor()
的替代品。该替换尊重由glVertexAttribBinding(...)
建立的顶点属性索引和绑定槽索引之间的绑定关联。这一点值得指出,因为它的名称与上面列出的其他两个函数的形式有些不同,而较旧的glVertexAttribDivisor()
看起来更符合形式,但使用的函数不正确。为了更好地理解这一点,我从扩展规范中添加了一些伪代码,展示了
glVertexAttribPointer (...)
如何与这个新的API添加相关的工作方式。命令:
控制顶点属性状态、顶点缓冲区绑定以及顶点属性和顶点缓冲区绑定之间的Map。
相当于(假设不产生错误):
一开始有点难理解,但归根结底,这与GL 3.3中引入采样器对象时采样器状态与纹理对象的分离非常相似。您可以继续使用旧的API,但此替代解决方案为您提供了更大的灵活性。
关于元素数组缓冲区,否。API的这一新部分与此无关,因为Vertex数组对象实际上管理一个且唯一的元素数组缓冲区绑定。
h79rfbju2#
不怎么有意思。
glBindVertexBuffers
用于绑定多个顶点缓冲区。至于glBindVertexBuffer
,用于将缓冲区绑定到顶点缓冲区。可能需要多次调用它才能绑定多个顶点缓冲区。您可以在此处查看他们的文档:http://www.opengl.org/sdk/docs/man/xhtml/glBindVertexBuffers.xml