18

有人愿意解释一下VertexBufferVertexArrayVertexBufferObjectVertexArrayObject之间的区别吗?我什至不确定这些是否都是不同事物的术语,但我已经看到它们都出现在 OpenGL 规范中。

我知道VertexBuffer只包含顶点而没有其他任何东西,一旦绑定,一旦我设置了顶点指针,我就可以使用 DrawArrays 来绘制它。我已经多次这样做了。

我正在使用我认为是 VertexArray 的东西,它存储设置的任何顶点缓冲区的状态,以及任何顶点指针。绑定 VertexArray 会自动绑定顶点缓冲区并设置顶点指针。我也(大部分)成功地使用了这个。

但是什么是VertexBufferObjectVertexArrayObject?他们更好吗?VertexArray 没有给我我需要的一切吗?

4

2 回答 2

18

顶点数组只是程序中的一些数据(在地址空间内),通过提供指向它的指针告诉 OpenGL。
虽然比单独指定每个顶点更有效,但它们仍然存在性能问题。GL 必须在您调用 DrawElements(或类似函数)时进行复制,因为这是唯一可以确定数据有效的时间(毕竟,没有什么可以阻止您立即覆盖数据)。这意味着并行性存在重大障碍,因此存在性能问题。

顶点缓冲区对象(“顶点缓冲区”)是您不拥有的原始数据块,即它们不在您的地址空间中。您可以使用 Copy(Sub)Data 将数据复制到缓冲区对象中,也可以将其临时映射到您的地址空间。一旦您取消映射缓冲区,它就不再属于您。巨大的优势是现在 GL 可以决定如何处理它,以及何时上传它。它知道数据是有效的,因为您无法访问它。这使得 CPU/GPU 并行性变得更加容易。

顶点数组 abject 有点用词不当。其中没有顶点或数组。它们只是一种“状态描述块”,封装了一个或多个顶点缓冲区对象(包括任何 VertexAttribPointer 调用)的绑定。因此,它们既是一个方便的函数,也更有效(更少的函数调用),但不是绝对必要的。您也可以手动完成 VAO 所做的任何事情。

于 2011-04-08T18:41:16.113 回答
7
  • BufferObject:GPU分配的内存缓冲区
    • Vertex Buffer Object:包含顶点信息(颜色、位置、着色器使用的自定义数据……)的 BufferObject
    • Pixel Buffer Object:一个包含像素或纹素信息的BufferObject。主要用于上传贴图。
    • 元素缓冲区对象:包含索引的 BufferObject(由glDrawElements使用)。
  • 顶点数组:gl*Pointer 调用使用的内存。可能是主机内存或顶点缓冲区对象,如果它使用glBindBuffer命令与GL_ARRAY_BUFFER.
  • 元素数组:glDrawElements 调用使用的内存。可能是主机内存或元素缓冲区对象,如果它使用glBindBuffer命令与GL_ELEMENT_ARRAY_BUFFER.
于 2011-04-08T18:45:42.293 回答