OpenGL加速渲染:顶点数组的索引模式

         使用顶点数组时,往往要将所有需要使用的顶点放入数组中,以便于统一调用。

         比如一条折线:

GLfloat vPoints[] = {	0.0, 0.0, 0.0,	//折线端点0
						1.0, 0.0, 0.0, 	//折线端点1
						1.0, 0.0, 0.0, 	//折线端点1
						1.0, 1.0, 0.0 	//折线端点2
};

         在顶点数组中,需要对端点1进行2次保存,因为线段0是由端点0、端点1两个端点构成,而线段1是由端点1、端点2两个端点构成,必须顺序保存所有调用的点,才可以用glDrawArrays进行统一的调用。即glDrawArrays用于一次性将指定内存区间的所有点绘制出来,不可以使用索引。

         当然,用glArrayElement来访问单个元素可以避免该问题。但访问单个元素效率较低。

         为了既保证效率,又减少存储空间,可以使用索引顶点数组

         索引顶点数组就是仅保存所有必要点,然后额外创建一个用于索引的数组。

         同一条折线:

GLfloat vPoints[] = {	0.0, 0.0, 0.0,	//折线端点0
						1.0, 0.0, 0.0, 	//折线端点1
						1.0, 1.0, 0.0 	//折线端点2
};
GLuint indexs[] = { 0,1,	//线段0端点0,1
					1,2 	//线段1端点1,2
};

         这样,就使用2个数组代替了原来的1个数组。

         在绘制图形较少的情况下,这样做并不一定节省内存。但当绘制图形非常多的时候,这种方式对内存的节省会很可观。

         数组定义完成后,调用:

GLfloat	vPoints[126];

  对每个元素进行赋值。

glEnableClientState(GL_VERTEX_ARRAY); //启用顶点数组
glVertexPointer(3, GL_FLOAT, 0, vPoints); //设置顶点数组属性
glDrawElements(GL_LINES, 4, GL_UNSIGNED_INT, indexs);

         其中,glDrawElements用于调用索引来绘制图形。该函数不需要在glBegin/glEnd之间调用。

void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);

参数:

1.       GLenum mode:指定绘制图元的类型,取值为:GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP,GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP,GL_QUADS, GL_POLYGON

2.       GLsizei count:为绘制图元的数量乘上一个图元的顶点数。也就是指所有绘制的图元的顶点数之和。这里2条线段,共4个顶点,所以这里为4。在这个例子中这个参数等于索引数组的元素个数。

3.      GLenum type:为索引值的类型,取值为:GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT,GL_UNSIGNED_INT注意GL_UNSIGNED_BYTE对应的值为unsigned byte,只有8位,其有效值最大仅为255。所以除非所绘图形的顶点数小于255,否则不要用该值。推荐使用GL_UNSIGNED_INT

4.       const GLvoid *indices:指向索引数组首地址

猜你喜欢

转载自blog.csdn.net/fyyyr/article/details/79298822