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