1.1 顶点数组
1.1.1 通过在glBegin()与glEnd()之间放置顶点、法向、纹理坐标等数据即可绘制。
glBegin(primitive type);
glVertex3f(...);
...
...
glEnd();
1.1.2 通过顶点数组把顶点颜色、坐标、法向等信息一次性传入显存,可以加快绘制效率。
glVertexPointer(3,GL_FLOAT,0,coords);
glColorPointer(4,GL_FLOAT,0,colors);
glDrawArrays(GL_TRIANGLES,0,numVerts);
1.1.3 使用Vertex Array的三个步骤:
//打开开关
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
// size :指定了每个顶点的分量数,type表示坐标的数据类型,stride:顶点数据的步长;
void glVertexPointer(GLenum size,GLenum type,GLsizei stride,const GLvoid *pointer);
void glColorPointer(GLenum size,GLenum type,GLsizei stride,const GLvoid *pointer);
//无size,默认都为3;
void glNormalPointer(GLenum type,GLsizei stride,const GLvoid *pointer);
void glArrayElement(GLint index);
glBegin(GL_TRIANGLES);
glArrayElement(2);
glArrayElement(3);
glArrayElement(5);
glEnd();
按顺序整体访问数组元素;
void glDrawArrays(GLenum mode,GLint first,GLsizei count);
创建一个数组元素的索引列表进行访问。
//对于顶点数据大量重复时,可以采用这种方式,或只想采用部分数据时;
void glDrawElements(GLenum mode,GLsizei count,GLenum type,const GLvoid * indices);
1.1.4 多种属性数据可以放到一个数组中,
对于顶点v(x,y,z)与颜色c(r,g,b,a)整合的数组data,可以采用stride来设置数据的偏移,从而绘制物体。
glVertexPointer(3,GL_FLOAT,7*sizeof(GLfloat),&data[0]);
glVertexPointer(4,GL_FLOAT,7*sizeof(GLfloat),&data[3]);
1.1.5 当物体需要不停绘制的时候,每次都需要将数据传输到显存,为了避免这样,可以采用缓冲区对象。顶点数组主要用在固定流水线中。
1.2 buffer Objec(缓冲区对象)
当绘制物体数,将数据传入显存后数据就驻留在显存,后面绘制就不需要传输数据。主要用在shader编程中。
1.3 Display list(显示列表方式)
将OpenGL命令驻留在显存,固化在了流水线当中。