顶点数组主要用于减少函数调用,和顶点的重复处理,从而达到优化内存和效率的目的。
顶点数组进行几何渲染需要三个步骤:
1、激活顶点数据,主要包括8:顶点坐标、表面法向量、RGBA颜色、辅助颜色、颜色索引、雾坐标、纹理坐标、多边形的边界标志。
启用函数:void glEnableCientState(glenum array)
禁用函数:void glDisableCientState(glenum array)
传入参数:
GL_VERTEX_ARRAY:顶点坐标
GL_NORMAL_ARRAY:表面法向量
GL_COLOR_ARRAY:RGBA颜色
GL_SECONDARY_COLOR_ARRAY:辅助颜色
GL_INDEX_ARRAY:颜色索引
GL_FOG_COORD_ARRAY:雾坐标
GL_TEXTURE_COORD_ARRAY:纹理坐标
GL_EDGE_FLAG_ARRAY:多边形的边界标志
2、指定数组数据:
void glVertexPointer(GLint size, GLenum type, GLsizei strike, const GLvoid *pointer);
void glColorPointer(GLint size, GLenum type, GLsizei strike, const GLvoid *pointer);
void glSecondaryColorPointer(GLint size, GLenum type, GLsizei strike, const GLvoid *pointer);
void glIndexPointer(GLenum type, GLsizei strike, const GLvoid *pointer);
void glNormalPointer(GLenum type, GLsizei strike, const GLvoid *pointer);
void glFogCoordPointer(GLenum type, GLsizei strike, const GLvoid *pointer);
void glTexCoordPointer(GLint size, GLenum type, GLsizei strike, const GLvoid *pointer);
void glEdgeFlagPointer(GLsizei strike, const GLvoid *pointer);
参数说明:
size :表示每个坐标中的元素数量。
type :pointer中的坐标数据类型。
stike :pointer表示顶点间的偏移量,若为0则紧密相连。
pointer :连续存放顶点单项数据的数组,从第一个坐标的第一项数据开始。
说明:主要从 pointer 中遵循一定的规则,从哪儿(pointer )开始,单个顶点的数据个数(size),顶点间的跨距(strike),获取指定类型的顶点列表。
3、解引用和渲染:
说明:解引用的函数中默认设置当前顶点的属性和状态。取出的顶点将是对应了所有状态和属性的顶点。
1). 解引用单个数组元素
void glArrayElement(GLint ith)
参数说明:
ith : 获取指定的数组数据中的第 ith 个数据
获取当前启用数组中的第 ith 个数据。获取的数据类型与 指定数组数据 中的类型相同。通常在 glBegin() 与 glEnd() 间调用。
2). 解引用数据列表
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
参数说明:
mode : 只接受与 glBegin()相同的参数,指定绘制类型。
count : 指定indices中使用顶点的数量。
type : 指定 indices 的数据类型。
indices : 使用的索引数组,保存执行 指定数组数组 中的顶点索引。
通过指定索引和绘制类型,相当于在一个 glBegin() 与 glEnd()中使用顶点。
3). 解引用数据列表的列表
void glMultiDrawElements(GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount)
参数说明:
mode : 只接受与 glBegin()相同的参数,指定绘制类型。
count : indices 中存放的对应的索引列表长度。
type : 指定 indices 的数据类型。
indices : 用于存放索引列表的列表。索引列表数组
primcount : count
的长度
相当于一个 glDrawElements() 的集合,indices
中的所有列表。
4). 解引用范围数据列表
void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid *indices)
参数说明:
mode : 只接受与 glBegin()相同的参数,指定绘制类型。
start : indices中从该位置开始
end : indices中从该位置结束
count : 指定indices中使用顶点的数量。
type : 指定 indices 的数据类型。
indices : 使用的索引数组,保存执行 指定数组数组 中的顶点索引。
只是指定了索引数组中的起始和结束,需要保证范围的有效性。
5). 解引用数组序列
void glDrawArray(GLenum model, GLint first, GLsizei count)
参数说明:
mode : 只接受与 glBegin()相同的参数,指定绘制类型。
first : 从启用的数组中的第 first 个开始。
count : 使用的数据元素个数,即 first + count -1 为元素的结束索引。
直接从顶点数组数据中通过索引范围指定数据。
6). 解引用数组序列的序列
void glMultiDrawArray(GLenum mode, GLint *first, GLsizei *count, GLsizei primcount)
参数说明:
mode : 只接受与 glBegin()相同的参数,指定绘制类型。
first : 数组元素序列的起始索引位置序列。
count : 数组元素序列的数量序列。
primcount: 数组元素序列的数量