原帖地址:
http://blog.csdn.net/cordova/article/details/52564074
http://ogldev.atspace.co.uk/www/tutorial10/tutorial10.html
顺序绘制
OpenGL提供了很多钟绘制函数,glDrawArray()是其中的一个。这个函数遵循顺序绘制,也就是说我们是将vertex buffer中的顶点按照给定的图元,一个顶点接一个顶点绘制出来的。这种模式很容易实现,但是如果我们有很多个图元共享一个顶点的话,我们就必须在vertex buffer中重复存储这个顶点。
索引绘制
索引绘制需要我们使用一个全新的索引缓存,例如,我们顶点缓存中存储的数据如下:
如果按照顺序绘制,那么我们就会按照v0,v1,v2,v3…的顺序绘制。
现在我们创建一个索引缓存,顾名思义,索引缓存里存储的是顶点缓存中顶点的索引。
如上图中,我们索引缓存中的值是2,0,1,5,···,那么如果按照索引缓存中的索引来绘制顶点,则绘制的顶点的顺序是v2,v0,v1,v5,···。
代码
GLuint IBO;
声明一个全局变量用于存储我们的索引缓存的句柄。
Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(0.0f, -1.0f, 1.0f);
Vertices[2] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[3] = Vector3f(0.0f, 1.0f, 0.0f);
这是我们构成三棱体的顶点。
unsigned int Indices[] = { 0, 3, 1,
1, 3, 2,
2, 3, 0,
0, 1, 2 };
这是我们的索引数组。
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
与创建VBO一样,创建IBO也是类似的过程,不过GL_ARRAY_BUFFER需要换成GL_ELEMENT_ARRAY_BUFFER。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
在渲染之前,我们需要将这个索引缓存再次绑定一下。
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
然后就可以调用这个函数进行渲染了。GL_TRIANGLES表明我们的图元类型是三角形,我们的索引由12个GL_UNSIGNED_INT数据构成,从索引数组的第一个元素(索引为0)开始。