Answers:
这是有关VBO的体面文章。
性能
这是调用语义的良好概述。
这是性能问题的另一个很好的概述。从中我们可以看到VBO的性能要高于阵列。
我们之所以选择VBO,是因为数据已加载到卡上,因此您不必每帧都传输数据。根据创建的VBO的类型,您可以为图形驱动程序提供用法提示(多次写入,多次读取与多次写入,从不读取等)。
用法
VBO对于静态几何(例如您不希望更改的地形)或实例几何非常有用。
顶点数组适用于频繁更改但也可以被主机读取的数据-因此,对于直接呈现经常被操纵的数据(例如,激光测距仪数据缓冲区就是我使用它们的地方)而言。如果您可以从不读取主机设备上的数据而摆脱困境(因此,只需将其推出卡中即可),则仅写模式下的VBO是一个不错的选择。
可移植性
客户端顶点数组 这些在3.0之前的OpenGL中可用,在3.0中已弃用,在3.1+中不可用。OpenGL ES支持它们(OpenGL ES 2不支持)。
VBO 这些在OpenGL 1.5之后可用。这些是在OpenGL ES 2(以及WebGL)中存储几何数据的唯一方法。
(我在此添加此内容是因为ChrisE的答案非常模棱两可,这很不幸,这是由于原始问题的模棱两可。但是,我将假定OP的问题应标题为“何时使用VAO”以及何时使用VBO ”。)
V ertex 乙 uffer ø bjects(这确实是不与其他类型的异种乙 uffer ø bjects,例如ü niform 乙 uffer ö bjects)提供用于上载顶点数据到图形硬件的手段。
V ertex 一个 rray Ø bjects在除了用于VBO S IN为了减少重新绑定独立的顶点缓存,并重新设定顶点所需的调用的数量,从而提高客户端(CPU端)的性能,属性,你想每次进行更改以某种方式进行渲染。不必在每一帧都完成所有工作,而是在初始化时执行一次,然后为使用关联顶点属性的每个(一组)绘制调用重新绑定适当的VAO。
尽管如此,使用VAO并不会使您不必承担glBindBuffer
+glBufferData
的任何数据改变每一帧,例如,游戏实体位置/旋转/转换矩阵。只有当您拥有完全静态的数据时,才需要glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
渲染。