摘要:在OpenGL绘制图形时,往往一个顶点会被重用多次(比如,一个正方体有8个顶点,但是每个顶点是3个面所共有,所以每一个顶点都必须指定3次),然而每次指定顶点都会有大量的函数调用,这回大大增加系统开销,为了解决这个问题OpenGL提供了顶点数组。
1. 启用
glEnableClientState( ARRAY_TYPE )ARRAY_TYPE:
GL_VERTEX_ARRAY,
GL_COLOR_ARRAY, GL_SECONDARY_COLOR_ARRAY,
GL_INDEX_ARRAY, GL_NORMAL_ARRAY,
GL_FOG_COORD_ARRAY, GL_TEXTURE_COORD_ARRAY,
GL_EDGE_FLAG_ARRAY
glDisableClientState(ARRAY_TYPE);
2. 指定数据
glVertexPointer( size, type, stride, *pointer )size: 每一组数据的大小
type:Data Type
stride:两个连续元素之间的字节数
eg:
static GLint vertex[] = {0, 0, 1, 0, 1, 0};
glVertexPointer( 3, GLint, 0, vertex );
void glColorPointer( size, type, stride, *pointer);
void glSecondaryColorPointer( size, type, stride, *pointer);
void glIndexPointer( type, stride, *pointer);
void glNormalPointer( type, stride, *pointer);
void glFogCoordPointer( type, stride, *pointer);
void glTexCoordPointer( size, type, stride, *pointer);
void glEdgeFlagPointer( stride, *pointer);
3. 解引用——方便使用定点数组
在此之前,数据在客户端,此步骤就是把数据发送到服务器端3.1 解引用Element————随机访问
(1)glArrayElement——单元素glArrayElement(index)
直接调用数组中的值
glBegin(GL_TRIANGLES);
glArrayElement(2);
glArrayElement(3);
glArrayElement(5);
glEnd();
(2)glDrawElements——多个元素
glDrawElements(mode, count, type, *pointer)
等价于:
glBegin(mode);
for (i = 0; i < count; i++)
glArrayElement(pointer[i]);
glEnd();
type:数组类型
GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT
(3)glMultiDrawElements
glMultiDrawElements(mode, *count, type, **pointer, arr_count)
等价于:
for (i = 0; i < primcount; i++)
{
if (count[i] > 0)
glDrawElements(mode, count[i], type, pointer[i]);
}
3.2 解引用Array————顺序访问
(1)glDrawArray( mode, first, count )glBegin (mode);
for (i = 0; i < count; i++)
glArrayElement(first + i);
glEnd();
(2)glMultiDrawArrays( mode, *first, *count, arr_count );
for (i = 0; i < primcount; i++)
{
if (count[i] > 0)
glDrawArrays(mode, first[i], count[i]);
}
3.3 混合数组
数组中可包含:纹理,颜色,法向量,顶点数据glInterleavedArrays( format, stride, *pointer );
format: GL__T__C__N__V