vao, vbo的一点拙见

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

 

vao, vbo的一点拙见

上一篇:【计算机系统概论】 第1章 计算机概述


下一篇:MAYA麦克风制作教程