vao 是vertex array object, 从名字上看,是顶点数组的对象
其创建是glGenVertexArrays(1, &mTriangleVao); 这样的方式创建的
vbo 是 vertex buffer object, 其是具体数据(buffer)的对象,
通过glGenBuffers(1, &mPosVbo) 类似这样的方式创建
vbo是绑在vao上的,一个vao可以绑定多个vbo
比如,为一个三角形创建一个vao, 然后为这个vao绑定具体的vbo,
一个vbo负责存储顶点数据,一个vbo存储颜色数据
glGenVertexArrays(1, &mTriangleVao); glBindVertexArray(mTriangleVao); glGenBuffers(1, &mPosVbo); glBindBuffer(GL_ARRAY_BUFFER, mPosVbo); glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(m_posAttr, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray(m_posAttr); glGenBuffers(1, &mColVbo); glBindBuffer(GL_ARRAY_BUFFER, mColVbo); glBufferData(GL_ARRAY_BUFFER,sizeof(colors), colors, GL_STATIC_DRAW); glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray(m_colAttr); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0);
这么搞的好处在于,我们在每一帧去draw的时候:
使用vao就可以直接绑定 vao 就行
glBindVertexArray(mTriangleVao); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0);
否则,就要按照以往的那种做法,非常麻烦,而且会有性能问题,因为这样会导致CPU不断的向GPU同步数据
glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, colors); glEnableVertexAttribArray(m_posAttr); glEnableVertexAttribArray(m_colAttr); glDrawArrays(GL_TRIANGLES, 0, 3);//0是顶点数组的起始索引,3是我们打算绘制多少个顶点 glDisableVertexAttribArray(m_colAttr); glDisableVertexAttribArray(m_posAttr);
update @ 2021.8.30