文章目录
- 1、 问题
- 2、步骤
- 2.1 激活数组
- 2.2 指定数组的数据
- 2.3 解引用和渲染
- 3、例子
1、 问题
1、在前面我们实现一个多彩三角形,调用三次glvertext()函数,如果在多边形,如20条边的,那么就要使用22次函数,如果还有颜色等其他要求,则会更多函数调用,多次函数调用开销比较大,能不能有其他方法,减少函数调用?
2、在正方体里,每一个顶点其实是三条边共用,每次绘制的时候都会调用三次,能不有共享顶点的冗余处理?
答案来了:那就是顶点数组。
定点数组:opengl提供一些顶点数组函数,允许只用少数数组指定大量的与顶点相关的数据,并用少量函数访问这些数据,可以解决上述问题。
2、步骤
使用顶点数组对几何图形渲染大致需要如下三个步骤:
1、激活(启用)最多可达八个数组(实际同时最多六个,有两个是相克的),每个数组有不同类型的数据:顶点坐标、表面法线、RGBA颜色、辅助颜色、颜色索引、雾坐标、纹理坐标、多边形边界标识。我们也可以用混合顶底数组,将上述用到的数组按照规则写成一个数组。
2、把数据放入数组中,这些数组是通过他们的内存地址进行访问的。
3、用这些数据绘制几何图形。
2.1 激活数组
使用函数 :
glEnableClientState(GLenum type);
2.2 指定数组的数据
可以通过八个不同函数用于之地鞥数组,每个函数用于指定不同类型的数组,另外也可以用一个函数指定多个数组。
使用函数 :
这里 stride 跨距参数,一般在混合数组中用到,就是说告诉取值如何不长取值。
2.3 解引用和渲染
解引用就是 取得指针所指向的数据,解引用可以是单个数组,也可以是数组元素列表等。
主要用的函数
glArrayElement(GLint ith); //单个数组元素
glArrayElements(GLenum mode, GLSize count, GLenum type,const GLvoid *indicas); //数组元素列表
glDrawElements();
–
3、例子
主要部分如下:
static GLint v1[] = {
25,25,
100,325,
175,25,
175,325,
250,25,
325,325
};
static GLfloat c1[] ={
1.0,0.2,0.2,
0.2,0.2,1.0,
0.8,1.0,0.2,
0.75,0.75,0.75,
0.35,0.35,0.35,
0.5,0.5,0.5
};
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(3,GL_FLOAT,0,c1);
glVertexPointer(2,GL_INT,0,v1);
glBegin(GL_TRIANGLES);
glArrayElement(2);
glArrayElement(3);
glArrayElement(5);
glEnd();