根据我的基本理解,顶点缓冲区对象的工作原理如下(伪代码): br />
line (0, 0) -> (1, 0)
line (1, 0) -> (1, 1)
line (1, 1) -> (0, 1)
line (0, 1) -> (0, 0)


如果我理解正确,请使用VBO将顶点加载到VBO中。

一个绘图命令。

define VBO
load (0,0) -> VBO
load (1,0) -> VBO
load (1,1) -> VBO
load (0,1) -> VBO
load (0,0) -> VBO


虽然我了解VBO的工作原理,但不知道为什么它们会提高性能。

它们如何提高性能?

#1 楼

通常,在即时模式下渲染对象时(例如,发出线条绘制命令),您会构建一系列提交给图形卡进行绘制的命令。如果要绘制大量数据或绘制频率很高,则可能会浪费大量时间一遍又一遍地发送此数据。

顶点缓冲区允许您生成一个对象,提交到图形卡一次。如果不需要更改几何形状,则可以将其保留在图形卡上,只需向图形卡发送绘制该对象的请求即可。由于它每次绘制时都避免了复制,因此每次绘制的开销要少得多。

请注意,使用顶点缓冲区对象并不总是能够提供非常明显的加速效果。如果您每帧仅绘制一次对象,并且要替换每帧之间的几何图形,那么您将无法避免避免每帧复制。经验来自使用诸如OpenGL之类的图形API编写程序,因此对图形驱动程序后端感到困惑的人可能可以提供更详细的答案,但是我希望这可以使事情变得更清楚。

#2 楼

有两个步骤可以使VBO比即时模式更有效。


即时模式(glBegin / glEnd,glVertex *等)意味着在每一帧上,您都需要填充顶点,将每个属性(位置,法线,颜色等)的属性分配给驱动程序,然后将其重新格式化,最后将整个程序包作为命令发送给GPU。在每个帧上每个顶点都有很多函数调用。等),您可以立即为驱动程序提供全部内容,并省去了重新设置顶点格式的负担。您实际上是通过整个网格的少量调用来有效地替换每个顶点的多个函数调用。但是您仍然需要在一个帧上执行一次。
顶点缓冲对象或VBO(请参阅glGenBuffers,glBindBuffer等)再进一步一步,并将数据存储在GPU端:您只发送一次,然后然后只需通过手柄引用即可。通过不在每一帧上一遍又一遍地发送相同的数据来节省带宽。


#3 楼

通过使用即时模式界面(例如旧式OpenGL glBegin()/ glEnd()/ glVertex()),您可以一次有效地将数据滴入驱动程序中。然后,它必须获取该单条数据,将其重新格式化,然后传递给硬件(如今,这意味着将其放入命令缓冲区)。在需要使用驱动程序之前,向驱动程序重新提供(希望)大数据块。它可以执行许多优化(重新格式化,放置到视频内存中),而且不必零碎地喂GPU。

实际上,如果您只绘制少量图元,则可能不会有太大的区别,但是,如果您要绘制数百万个三角形网格,那么视频内存中的VBO则是可行的方法。