VAO与VBO
本文旨在解释VAO(vertex array object)和VBO(vertex buffer object)的相关概念。
随着OpenGL状态和固定管线模式的移除,我们需要一种新的方式来将数据传输到图形卡以渲染图形。我们可以采用VBO,或者是在OpenGL3以上版本引入的新的特性VAO。我们可以把同一个渲染对象的顶点数据和颜色存储在处于同一个VAO中的不同VBO中。
–VAO是包含一个或者多个VBOs的对象,被设计用来存储被完整渲染对象的相关数据信息,如渲染对象的顶点信息和每一个顶点的颜色信息。
–VBO是显卡高速显存的缓冲区,用来保存顶点的信息。
以一个单色三角形为例,其可以使用两个VBOs分别存储顶点位置信息和顶点的颜色信息,这两个VBOs处于同一个VAO中。类似的,还可以将法线、纹理或其他信息存储在VBO中。VAO是一个容器,它将所有可以由glVertexAttribPointer和其它一些函数进行设置的状态包装到一起。在使用一个VAO时,通过glVertexAttribPointer调用来指定的状态都会被存储到当前的VAO中。
VAO把对象信息直接存储在图形卡中,而不是在当我们需要的时候传输到图形卡,即Direct3D所采用得方式,而在OpenGL中只有OpenGL3.X以上的版本中采用。这意味着应用程序不用将数据传输到图形卡或者是从图形卡输出,从而获得了额外的性能提升。
VAO, VBO使用方法
1.产生VAO
/* Allocate and assign a Vertex Array Object to our handle */
void glGenVertexArrays(GLsizei n, GLuint *arrays);
n: VAO对象数量, arrays: VAO对象指针
2.绑定VAO
/* Bind Vertex Array Object as the current used object */
void glBindVertexArray(GLuint array);
array: 要绑定数组的名称
3.产生VBOs
void glGenBuffers(GLsizei n, GLuint* buffers);
n: VBO对象数量, buffers: VBO对象指针
4.绑定VBO
void glBindBuffer(GLenum target, GLuint buffer);
target:GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, or GL_PIXEL_UNPACK_BUFFER.
5.给VBO分配数据
void glBufferData( GLenum target, GLsizeiptr size,
const GLvoid * data, GLenum usage);
target: GL_ARRAY_BUFFER(表示顶点数据), GL_ELEMENT_ARRAY_BUFFER(表示索引数据),GL_PIXEL_PACK_BUFFER(表示从OpenGL获取的的像素数据), or GL_PIXEL_UNPACK_BUFFER(表示传递给OpenGL的像素数据)
size: