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的使用:
然后在需要使用的地方调用glBindVertexArray函数绑定就可以了,这样的话,在多个不同的物体之间切换绘制的话,会非常方便。
EBO:
元素缓冲对象(Element Buffer Object,EBO),也叫索引缓冲对象(Index Buffer Object,IBO)。
假设我们绘制一个四边形或者多边形,从渲染基础处可得知,我们需要把绘制的物体分解为多个三角形。
以四边形为例,分解为2个三角形,产生了6个顶点数据。
我们发现,重合边的顶点是完全一样的,实际四边形只有4个顶点,这样就产生了50%的额外开销,当我们绘制的物体很多时,这种额外的开销问题就会很突兀。
如何只存储4个顶点呢?
我们只需要定义4个顶点,外加一个额外的索引数组就可以让GPU知道如何绘制物体了。