本节我们来看一下glDrawElements API的使用,对应的代码是OpenGL\learn\src\main\java\com\opengl\learn\GlDrawElementsRender.java文件。
所有实例均有提供源码,下载地址:Opengl ES Source Code。
API中文说明:GLES2.0中文API-glDrawElements。
和上一节类似,glDrawElements也是Opengl提供的绘制API。我们最常用的绘制三角形,第一个参数就是GL_TRIANGLES、GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN,这三种绘制的顺序上一节已经详细介绍过了,大家如果还有疑问,请回头翻看:Opengl ES系列学习--glDrawArrays API使用。
那么我们具体来看一下,glDrawElements是有什么不同呢?它和我们之前介绍的绘制方式不一样,是使用索引来绘制的,一般都是结合GL_ELEMENT_ARRAY_BUFFER一起完成绘制的。索引是什么意思呢?比如上节我们调用glDrawArrays API以GL_TRIANGLES方式完成那个五边形的绘制,那么一共五个三角形,总共需要15个顶点,如果需要的三角形更多,我们定义顶点数据就麻烦了,看一下我们上节定义的数组。
private final float[] mVerticesTriangles =
{
0.0f, 0.0f, 0.0f, // v0
0.0f, 0.5f, 0.0f, // v1
-0.5f, 0.0f, 0.0f, // v2
0.0f, 0.0f, 0.0f, // v0
-0.5f, 0.0f, 0.0f, // v2
-0.5f, -0.5f, 0.0f, // v3
0.0f, 0.0f, 0.0f, // v0
-0.5f, -0.5f, 0.0f, // v3
0.5f, -0.5f, 0.0f, // v4
0.0f, 0.0f, 0.0f, // v0
0.5f, -0.5f, 0.0f, // v4
0.5f, 0.0f, 0.0f, // v5
0.0f, 0.0f, 0.0f, // v0
0.5f, 0.0f, 0.0f, // v5
0.0f, 0.5f, 0.0f // v1
};
然而实际存在的顶点只有五个,那么我们可以给它们标号,然后直接使用标号就可以了(012)、(023)、(034)、(045)、(051);另一点,我们之前的绘制方式是每次都传实际的顶点数组给着色器程序的,那样效率也较低,而我们可以提前申请一些缓冲区,每个缓冲区都有对应的标号,先把顶点数据填充到缓存区中,绘制的时候只需要传递缓冲区的标号就可以了,这样才是更高效的作法。
那么先来看一下如何使用该API,实例程序如下:
glDrawElements(GL_TRIANGLES, mIndicesData.length, GL_UNSIGNED_SHORT, 0);
第一个参数就是使用什么样的方式绘制三角形,和上节的glDrawArrays作用相同,第二个参数指定要绘制的个数,这里是指尖索引顶点的个数,第三个参数是索引数据的类型,因为我们的索引数据使用short,所以这里就传GL_UNSIGNED_SHORT,最后一个是offset,我们是从头开始绘制的,所以偏移量为0。
我们最后绘制的实际效果如下: