顶点缓存对象(VBO)和顶点数组对象(VAO)以及顶点数组(VA)的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DY_1024/article/details/87272550

在区分VBO以及VAO之前,我们先来了解其他的几个概念:glvertex,glCallList(显示列表),VA(顶点数组)。

一、glvertex

glvertex是最原始的设置顶点的方式,在glBegin和glEnd之间使用,每设置一次,就要和GPU通信一次,效率比较低。

二、glCallList(显示列表)

因为之前的glvertex每设置一次都要和GPU通信一次,效率比较低,现在的glCallList(显示列表)只和GPU通信一次,在通信之前将所有需要设置的定点的额数据都收集好,一次性发送给GPU。

缺点:绘制之前要将所有的顶点数据收集完,传到GPU之后不能在更改数据。

三、VA(顶点数组)

顶点数组也是收集好所有的顶点数据,一次性传送给GPU,但是现在因为数据不是在GPU中储存的,所以绘制的速度没有glCallList快,优点是可以对数据进行修改。

四、VBO(顶点缓冲对象)

VBO更像是VA的一个升级版,出现的背景是因为人们发现VA和显示列表都有一些不尽人意的地方,但是提高绘制顶点的方法只有:VA和显示列表,但是这两种方法都有缺点。

VA是在客户端进行设置,所以执行这类函数之后还要将顶点数据发送给服务端,也就是我们的二次处理,降低了效率。如果我们的缓存能直接将顶点的数据发送给服务端,就可以避免二次处理,从而提高效率。这也是我们VBO的特性之一。

显示列表的缺点是在于不能修改顶点数据,比较适合绘制一些不经常改变的物体,直接将数据传送给GPU,因为硬件层已经脱离了我们的绘制流水线,所以我们无法去修改数据。而VBO是将数据传送给绘制流水线,效率虽然没有显示列表高,但是我们可以在该帧到达流水线的某一步的时候,将顶点数据取出来,进行修改。这也是VBO的特性之一。

VBO结合了VA和显示列表两者的特性,效率在两者之间。

五、VAO(顶点数组对象)

VAO里面记录了每一次绘制所需的所有的VBO的信息,绘制的时候直接从特定的位置去取特定的信息。

VAO不是buffer object,所以不储存数据。

VAO和VA没有任何的关系。

VAO可以理解为VBO的状态容器,记录VBO的状态。

猜你喜欢

转载自blog.csdn.net/DY_1024/article/details/87272550