GlBindVertexBuffer与glBindBuffer

qpgpyjmq  于 2022-10-18  发布在  其他
关注(0)|答案(2)|浏览(262)

我看到我可以使用glBindBuffer(GL_ARRAY_BUFFER, vbo);绑定顶点缓冲区。这是可行的,我还可以使用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);绑定一个元素数组。当使用这些时,一切都如所愿地绘制。
在阅读第10.3.1节中的OpenGL 4.4规范时,我发现提到了glBindVertexBuffer。这看起来像是允许绑定多个顶点缓冲区,然后一次渲染所有顶点缓冲区。这样对吗?另外,它与使用glBindBuffer有什么不同?在绑定顶点缓冲区时,可以使用元素数组缓冲区吗?

7dl7o3gd

7dl7o3gd1#

实际上,glBindVertexBuffer (...)的意义完全不同。
GL_ARB_vertex_attrib_binding中引入它的想法是分离顶点缓冲区和指针之间一直存在的固定Map,并用一个更灵活的系统来取代它,该系统允许您为顶点属性设置格式,为顶点缓冲区/属性设置绑定位置,然后简单地交换绑定到该位置的缓冲区。
您不仅要用这个新函数替换对glBindBuffer (...)的调用,还需要调用至少另外两个函数来设置通用顶点属性,以便能够利用glBindVertexBuffer (...)
1.glVertexAttribFormat (...)-这实际上与glVertexAttribPointer (...)相同,除了它不设置指针,它只是建立如何解释将与该属性配对的缓冲区。
1.glVertexAttribBinding (...)-将通用属性位置与新的类型的绑定位置(顶点缓冲区绑定)相关联,以便您可以使用glBindVertexBuffer (...)将您的VBO绑定到此属性将使用的位置。
1.glVertexBindingDivisor (...)--这是glVertexAttribDivisor()的替代品。该替换尊重由glVertexAttribBinding(...)建立的顶点属性索引和绑定槽索引之间的绑定关联。这一点值得指出,因为它的名称与上面列出的其他两个函数的形式有些不同,而较旧的glVertexAttribDivisor()看起来更符合形式,但使用的函数不正确。
为了更好地理解这一点,我从扩展规范中添加了一些伪代码,展示了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);

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

相当于(假设不产生错误):

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);

一开始有点难理解,但归根结底,这与GL 3.3中引入采样器对象时采样器状态与纹理对象的分离非常相似。您可以继续使用旧的API,但此替代解决方案为您提供了更大的灵活性。
关于元素数组缓冲区,否。API的这一新部分与此无关,因为Vertex数组对象实际上管理一个且唯一的元素数组缓冲区绑定。

h79rfbju

h79rfbju2#

不怎么有意思。glBindVertexBuffers用于绑定多个顶点缓冲区。至于glBindVertexBuffer,用于将缓冲区绑定到顶点缓冲区。可能需要多次调用它才能绑定多个顶点缓冲区。
您可以在此处查看他们的文档:http://www.opengl.org/sdk/docs/man/xhtml/glBindVertexBuffers.xml

相关问题