VAO(顶点数组对象)、VBO(顶点缓冲对象)、EBO(元素缓冲对象)

201 阅读2分钟

VBO是GPU中的一块内存,作用是存储大量的顶点数据,以便一次性全部发送给GPU提高访问效率。

创建VBO:

var vbo = GLuint()

glGenBuffers(1, &vbo)

创建之后绑定:

glBindBuffer(GLenum(GL_ARRAY_BUFFER), vbo) 

将顶点数据刷入vbo:

glBufferData(GLenum(GL_ARRAY_BUFFER), MemoryLayout.size * 24, vertexs, GLenum(GL_STATIC_DRAW))

将VBO更新到着色器属性:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

VAO:

我们每绘制一个物体,都要重复一次VBO的创建和绑定,假如要绘制上百个不同的物体呢?:

VAO可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。这使在不同顶点数据和属性配置之间切换变得非常简单,只需要绑定不同的VAO就行了。刚刚设置的所有状态都将存储在VAO中。

VAO的使用:

image.png

然后在需要使用的地方调用glBindVertexArray函数绑定就可以了,这样的话,在多个不同的物体之间切换绘制的话,会非常方便。

EBO:

元素缓冲对象(Element Buffer Object,EBO),也叫索引缓冲对象(Index Buffer Object,IBO)。

假设我们绘制一个四边形或者多边形,从渲染基础处可得知,我们需要把绘制的物体分解为多个三角形。

以四边形为例,分解为2个三角形,产生了6个顶点数据。

我们发现,重合边的顶点是完全一样的,实际四边形只有4个顶点,这样就产生了50%的额外开销,当我们绘制的物体很多时,这种额外的开销问题就会很突兀。

如何只存储4个顶点呢?

我们只需要定义4个顶点,外加一个额外的索引数组就可以让GPU知道如何绘制物体了。

image.png