OpenGL顶点缓冲区混乱

时间:2011-04-08 18:31:32

标签: opengl vertex-buffer vertex-array vertexdata

有人会关心解释 VertexBuffer VertexArray VertexBufferObject VertexArrayObject <之间的区别/ em>的?我甚至不确定这些是否适用于不同的东西,但我看到它们都出现在OpenGL规范中。

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

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

但是什么是 VertexBufferObject VertexArrayObject ?他们更好吗? VertexArray不能给我我需要的一切吗?

2 个答案:

答案 0 :(得分:15)

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

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

顶点阵列abjects有点用词不当。它们中没有顶点或数组。它们只是一种“状态描述块”,它封装了一个或多个顶点缓冲区对象(包括任何VertexAttribPointer调用)的绑定。因此,它们既是便利功能又是更高效(更少的函数调用),但并非严格必要。您也可以手动执行VAO所做的任何事情。

答案 1 :(得分:8)

  • BufferObject:GPU分配的内存缓冲区
    • Vertex Buffer Object:包含顶点信息的BufferObject(颜色,位置,着色器使用的自定义数据,......)
    • 像素缓冲区对象:包含像素或纹素信息的BufferObject。主要用于上传纹理。
    • 元素缓冲区对象:包含索引的BufferObject(由glDrawElements使用)。
  • 顶点数组:gl *指针调用使用的内存。如果使用GL_ARRAY_BUFFER命令与GL_ELEMENT_ARRAY_BUFFER绑定,则可能是主机内存或顶点缓冲区对象。
  • 元素数组:glDrawElements调用使用的内存。如果使用{{1}}命令与{{1}}绑定,则可能是主机内存或元素缓冲区对象。