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