有人会关心解释 VertexBuffer , VertexArray , VertexBufferObject 和 VertexArrayObject <之间的区别/ em>的?我甚至不确定这些是否适用于不同的东西,但我看到它们都出现在OpenGL规范中。
我知道 VertexBuffer 只包含顶点而没有其他任何东西,一旦绑定,一旦我设置了顶点指针,我就可以使用DrawArrays来绘制它。我已经多次这样做了。
我正在使用我认为的VertexArray,它存储所设置的任何顶点缓冲区的状态,以及任何顶点指针。绑定VertexArray会自动绑定顶点缓冲区并设置顶点指针。我也成功地使用了这个(大部分)。
但是什么是 VertexBufferObject 和 VertexArrayObject ?他们更好吗? VertexArray不能给我我需要的一切吗?
答案 0 :(得分:15)
顶点数组只是程序中的一些数据(在地址空间内),通过提供指向它的指针告诉OpenGL。 虽然比单独指定每个顶点更有效,但它们仍然存在性能问题。 GL必须在您调用DrawElements(或类似函数)时制作副本,因为这是唯一可以确定数据有效的时间(毕竟,没有什么能阻止您立即覆盖数据)。这意味着并行性存在严重障碍,从而导致性能问题。
顶点缓冲区对象(“顶点缓冲区”)是您不拥有的原始数据块,即它们不在您的地址空间中。您可以使用复制(子)数据将数据复制到缓冲区对象中,也可以将数据临时映射到地址空间。取消映射缓冲区后,它就不再属于您。巨大的优势是现在GL可以决定如何处理它,以及何时上传它。它知道数据有效,因为您无法访问它。这使得CPU / GPU并行性变得更加容易。
顶点阵列abjects有点用词不当。它们中没有顶点或数组。它们只是一种“状态描述块”,它封装了一个或多个顶点缓冲区对象(包括任何VertexAttribPointer调用)的绑定。因此,它们既是便利功能又是更高效(更少的函数调用),但并非严格必要。您也可以手动执行VAO所做的任何事情。
答案 1 :(得分:8)
GL_ARRAY_BUFFER
命令与GL_ELEMENT_ARRAY_BUFFER
绑定,则可能是主机内存或顶点缓冲区对象。