何时使用顶点数组以及何时使用VBO?


14

我正在尝试了解顶点数组顶点缓冲区对象,但是我不了解以下方面的差异:

  • 使用情况(例如地形等静态几何体,每一个帧都在变化的几何体,例如粒子系统等)
  • 性能
  • 便携性(旧显卡,控制台,Android或iPhone等设备等)

一些澄清?


3
对于到达这里的其他人,请在此处查看投票最多的答案。... stackoverflow.com/questions/430555/…–
afuzzyllama 2012年

Answers:


14

是有关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)中存储几何数据的唯一方法。


2
在该PerformanceTuning.pdf中,它表示VBO“在非最佳情况下可能会损害性能”……但并未详细说明。知道那些情况是什么吗?我有一种情况,我需要每帧更新几何图形,所以我想知道在这种情况下,顶点数组是比VBO更好还是更差。谢谢。
sidewinderguy 2012年

1
请阅读opengl.org/sdk/docs/man/xhtml/glDrawElements.xmlopengl.org/wiki/GlDrawElements-顶点数组。弄清楚事实,伴侣,因为您传播的只是错误信息

1
@vaxquis不建议使用客户端顶点数组。服务器端顶点数组不是。VAO是另一回事,旨在保存状态。帖子中没有错,但是如果声明客户端则可能更准确。但是我想那是隐含的。
concept3d 2014年

1
“不建议使用客户端顶点数组。不建议使用服务器端顶点数组。” “顶点数组在3.0之前的OpenGL中可用,在3.0中已弃用,在3.1+中不可用。” “您可以预先指定单独的顶点数组(...),并使用它们通过一次调用glDrawElements来构造图元序列。版本4.4中的核心”-我在这些语句中发现矛盾。

2
另外,在说“不赞成使用”之前,请指明声明的来源,最好是在官方文档中。从StackExchange指向StackOverflow作为证明不是科学的工作方式,以“我想那是隐含的”进行辩护并不是一个论点。没有人问过客户端/服务器阵列,与VBO相比,问题是从最广泛的意义上讲关于顶点阵列。顺便说一句,关于VAO,我还没说什么,这个想法是从哪里来的?

11

(我在此添加此内容是因为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)渲染。


+1 VAO是一个可怕且令人困惑的名称,它总是使我想起openGL变得一团糟。
concept3d 2014年

1
我还记得有关该问题的讨论(大部分已删除)。同样,问题出在OpenGL的可怕术语上。我还编辑了克里斯答案以使其更准确。
concept3d 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.