《OGL dev》Etay Meiri Tutorial 10 - Indexed Draws 笔记

索引绘制与顺序绘制相比能够节省内存。

索引绘制的流程:

  1. 顺序绘制中除draw call调用以外的部分保持不变。
  2. 创建一个数组,用于设置索引:unsigned int Indices[] = { 0, 3, 1, 1, 3, 2, 2, 3, 0, 0, 1, 2 };
  3. 创建一个buffer对象,用于存储索引:GLuint IBO; glGenBuffers(1, &IBO);
  4. 为buffer对象绑定名称:glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);。GL_ELEMENT_ARRAY_BUFFER表示index buffer。之前使用的GL_ARRAY_BUFFER表示vertex buffer。
  5. 为index buffer填充数据:glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
  6. 调用索引绘制的draw call:glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
    1. 第一个参数表示拓扑,GL_TRIANGLES是三角形。
    2. 12表示绘制12个顶点。
    3. 第三个参数表示buffer中索引的数据类型,GL_UNSIGNED_INT对应unsigned int。还可以是GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT。
    4. 第四个参数类型为GLvoid *。为0时表示,从buffer首地址读入索引。不为0的话,是以byte为单位的buffer首地址偏移量。注意,类型必须强转为GLvoid *。