你能用一个VBO多个目标吗?

mpe*_*pen 6 opengl vbo buffer-objects

示例代码:

1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)

所以我们生成一个通用的VBO句柄,然后使用"GL_ARRAY_BUFFER"绑定它.绑定似乎有两个目的:

  1. 在我们将数据复制到GPU之前,我们必须绑定缓冲区 glBufferData
  2. 我们必须先绑定缓冲区才能通过它添加属性 glVertexAttribPointer

而且我认为这是你需要绑定VBO的唯一两次.我的问题是,是否存在第2和第3行的目标(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER或GL_PIXEL_UNPACK_BUFFER)不同的情况?或者我们想要在第4行之前将其重新绑定到不同的目标?

我们可以将多个缓冲区目标绑定到单个VBO吗?

Nic*_*las 11

您不会将目标绑定到缓冲区对象.目标是OpenGL上下文中的位置,您可以将事物(如缓冲区对象)绑定到.因此,您将缓冲区对象绑定目标,而不是相反.

缓冲对象(不存在这样的东西作为一个VBO.只是有缓冲对象)仅仅是一个未格式化,由所述OpenGL驱动拥有存储器线性阵列.您可以将它用作顶点数组数据的源,方法是将缓冲区绑定到GL_ARRAY_BUFFER并调用其中一个gl*Pointer函数.这些函数适用于当前绑定的缓冲区GL_ARRAY_BUFFER.您可以通过将它们绑定到GL_ELEMENT_ARRAY_BUFFER并调用其中一个glDrawElements函数来将它们用作索引数据的源.

用于修改缓冲器的功能的对象的内容(glBufferData,glMapBuffer,glBufferSubData,等等)的所有具体地利用一个目标为它们运行上下工夫.所以,glBufferData(GL_ARRAY_BUFFER, ...)做它的东西到任何缓冲当前必然GL_ARRAY_BUFFER.

因此,有两种影响缓冲区对象的函数:修改其内容的函数以及在操作中使用它们的函数.后者特定于来源; glVertexAttribPointer 始终使用当前绑定的缓冲区GL_ARRAY_BUFFER.你不能让它使用不同的目标.同样,glReadPixels始终使用绑定的缓冲区GL_PIXEL_PACK_BUFFER.等等.如果一个函数用缓冲区对象填充但没有将目标作为参数,那么它的文档将告诉你它从哪个目标查找缓冲区.

注意:顶点数组有点奇怪.顶点属性和缓冲区对象之间的关联是通过调用来实现的glVertexAttribPointer.此函数的作用是使用当前绑定到GL_ARRAY_BUFFER的缓冲区对象为该属性设置适当的数据.通过"当前绑定",我的意思是在调用此函数时绑定.因此,在调用此函数后,您可以立即调用glBindBuffer(GL_ARRAY_BUFFER, 0),并且它将不会改变您进行渲染时会发生什么.它会渲染得很好.

通过这种方式,您可以为不同的属性使用不同的缓冲区对象.该信息将保留,直到您通过另一个glVertexAttribPointer特定属性的调用进行更改.