产生原因: Opengl对几何图元的绘制需要大量的函数调用,每个函数调用都需要时间,为了减少这部分时间。减少图元绘制过程调用的函数 步骤: 1.激活 glEnableClientState(param) GL_VERTEX_ARRAY GL_COLOR_ARRAY GL_SECONDARY_COLOR_ARRAY GL_INDEX_ARRAY GL_NORMAL_ARRAY GL_FOG_COORDINATE_ARRAY GL_TEXTURE_COORD_ARRAY GL_EDGE_FLAG_ARRAY 2.指定数组的数据 glColorPointer glSecondaryColorPointer gl**Pointer 3.解引用单个数组元素 glArrayElement(index) |
void glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); size:每组颜色所占数组元素格式,(RGB每个分量各占1,因此size=3) type:每一个分量对应的数据类型 stride 跳跃值:当多个类型数据在同一个数组存储时,用跳跃值来区分。 比如pointer[]={r1,g1,b1,v1x,v1y,v1z,r2,g2,b2,v2x,v2y,v2z}用来存储颜色和顶点值 那么stride=6*sizeof(float) 因为pointer[0]是第1组颜色的起点pointer[2]第二组颜色的起点位置。 一般将不同类型的数据分别存储,那么这个值就是0 pointer :存储颜色数据的数组 |
void glArrayElement (GLint i); i:可以理解为图元的一点。 比如:glVertexPointer(3,GL_FLOAT,0,vertices); 当i=2是,对应的点为vertices[3]~vertices[5] |
解引用数组元素的一个列表 glDrawElements (GLenum mode, GLsizei *count, GLenum type, const GLvoid *indices); 相当于: glbegin(mode) for(i=0;i<count<i++) glArrayElement(indices[i]); glend(); |
解引用多个数组元素 glMultiDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,GLsizei primcount) 相当于: for(i=0;i<primcount;<i++) glDrawElements(mode,count[i],type,indices[i]) |
解引用一个数组元素序列 void glDrawArrays (GLenum mode, GLint first, GLsizei count); 相当于: glBegin(mode) for(i=0;i<count;<i++) {glArrayElement(first+i)} glEnd(); 解引用多个数组元素序列 glMultiDrawArrays(GLenum mode, GLint* first, GLsizei *count, GLsizei primcount); 相当于: for(i=0;i<primcount;<i++) {glDrawArrays(mode,first[i],count[i])} |
顶点数组对象 随着程序逐渐增大并且使用更多的模型,有时每个帧可能存在多个顶点数组的切换,比如在一帧有一个矩形 一个三角形,一个多边形,那么每次重绘时都需要解引用(glColorPointer),以更改其中的值。造成了大量函数调用。顶点数组对象可以解决这个问题,简单的说,顶点数组对象像是一个顶点数组集合,在集合1位置存储矩形顶点数组,集合2位置存储三角形顶点数组,集合3位置存储多边形顶点数组。那么每次绘制不同的图形时只需要从相应的位置取出即可 |
做法: 1.生成顶点数组对象 glGenVertexArrays(Glsizei n,Gluint *arrays) 在其中定义图元的详细信息 2.创建与绑定顶点数组对象 glBindVertexArray(Gluint array) 3.当使用时再次调用 glBindVertexArray(Gluint array) |
glDeleteVertexArrays(Glsizei n,Gluint *arrays)
|
OpenGL学习七:顶点数组
最新推荐文章于 2024-01-29 16:13:43 发布