1、启用数组
其中最常用的是前两个,本文就以前两个为例。使用结束后,要关闭数组以释放资源,函数如下:
2、指定数组的数据
其中:
其他数组使用发发与上述函数类似。
举例如下:
static GLint vertices[]={25,25,
static GLfloat colors[]={1.0,0.0,0.0,
glEnableClientState(GL_VERTEX_ARRAY);//启用顶点坐标数组
glEnableClientState(GL_COLOR_ARRAY); //启用顶点颜色数组
glVertexPointer(2,GL_INT,0,vertices);//指定坐标数据
glColorPointer(3,GL_FLOAT,0,colors); //指定颜色数据
通过上述的操作,就定义了四个顶点的坐标和颜色,如:第一个顶点的坐标为[25,25],颜色为红色,依次类推。
也可以将不同类型数组的数据放在同一个数组中,如:
static GLfloat interwind[]={25,25,1.0,0.0,0.0,
glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&interwind[0]);
glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&interwind[2]);
这里与上面唯一不同的就是第三个参数,这里面,第三个参数是指本数组中(如坐标数组),两个顶点同类坐标之间的距离(如,两个顶点第一个坐标的距离)。当然,它的值若不是0,那么所乘的系数,一定是大于第一个参数的(如,5大于2)。
3、解引用与渲染
获取第ith个顶点的信息,至于能获得哪些信息,取决于开启了哪些顶点数组。如(接上诉代码):
则按照上述定义的第2,3,4(第一个顶点是0)个顶点画三角形,这里需要注意的事,glArrayElement函数只是单纯的引用顶点,必须放在glBegin()和glEnd()之间才有意义。
上述方法适合灵活的调用较少数量的顶点,对于顶点较多的几何元素,可以用下列方法:
其中:
效果类似于:
例如,要用以上定义好的数据画两个三角形:
static GLubyte triangleone[]={0,1,2};
static GLubyte triangletwo[]={1,2,3};
glDrawElements(GL_TRIANGLE,3,GL_UNSIGNED_BYTE,triangleone);
glDrawElements(GL_TRIANGLE,3,GL_UNSIGNED_BYTE,triangletwo);
注意,glDrawElements函数不需要也不能放在glBegin()和glEnd()之间。
void glMultiDrawElements(GLenum mode,GLsizei *count,GLenum type,void **indices,GLsizei primcount);
效果相当于:
for(i=0;i<primcount;i++){
}
其中,indeces定义为GLvoid *indeces[primcount]={描述顶点序列的primcount个数组名};
还有其他的一些函数,在这里不再一一分析,可以参考“红宝书”第二章的内容。
顶点数组为构建复杂图元提供了灵活而有效的解决方案,同时提高了OpenGL程序的执行效率,在以后的变成中,应尽量用顶点数组的方式定义图元,以便熟悉并灵活运用!