回看EGL&OpenGL着色语言及案例,咱们从案例代码6.3 顶点、纹理数据
中能够看到,一个正方形四个顶点,会分红两个三角形六个顶点,顶点数组中就会存在重复的两条数据,当图形更复杂时,重复的数据就会更多。那么有没有存在一种方式能够简化?数组
以前咱们采用的绘图方式是序列绘图
,使用glDrawArrays
函数。缓存
序列绘图是将顶点按顺序存放在顶点缓存中,当绘图时,按照图元绘制方式进行读取并绘制出图形。 markdown
若是绘制三角形,会取出“1,2,3”数据进行绘制。函数
而索引绘图
的顶点也是存储在顶点缓存中,但它的读取方式是由咱们提供的索引数据决定的,索引数组保存了顶点之间的链接关系。 绘制三角形时,会取出“1,3,7”数据进行绘制。oop
索引绘图的优点:post
索引数组保存的是,图形中三角形顶点的链接关系,哪三个顶点组成一个三角形
.好比说,上图中的索引数组能够经过1-2
连线切割为两个三角形,索引数组为ui
GLuint indices[] = {
0,1,2,
1,3,2,
}
复制代码
对应的顶点数组为编码
GLfloat attrArr[] = {
-0.5f, 0.5f, -1.0f, 0.0f, 1.0f, //左上0
-0.5f, -0.5f, -1.0f, 0.0f, 0.0f, //左下1
0.5f, 0.5f, -1.0f, 1.0f, 1.0f, //右上2
0.5f, -0.5f, -1.0f, 1.0f, 0.0f, //右下3
};
复制代码
6.4 开始绘制
中spa
glDrawArrays(GL_TRIANGLES, 0, 6);
替换为
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_INT, indices);
/*
void glDrawElements(GLenum mode, GLsizei count,GLenum type, const GLvoid *indices
mode:图元绘制方式
count:顶点总数
type:索引值类型
indices:索引数组存储位置的指针
*/
复制代码
推荐引用:.net