您的位置:首页 > 运维架构

OpenGL顶点数组

2015-06-19 13:13 369 查看
OpenGL中,如果要绘制图元,一般来说会使用:

glBegin(GL_LINES);
   glVertex3f(0.0f, 0.0f, 0.0f); 
   glVertex3f(1.0f, 0.0f, 0.0f);
glEnd();


但是,如果顶点数太多,这种方法需要频繁调用函数,效率太低。这就要用到顶点数组。

1. 启用顶点数组

OpenGL是一种状态机,在用某一功能前,必须先开启这项功能,用完之后,也可以关闭。

启用和关闭顶点数组的代码如下:

glEnableClientState(GL_VERTEX_ARRAY);   //启用
glDisableClientState(GL_VERTEX_ARRAY);  //关闭


其中,GL_VERTEX_ARRAY是数组的类型,共有八种:

GL_VERTEX_ARRAY

GL_COLOR_ARRAY

GL_SECOND_COLOR_ARRAY

GL_INDEX_ARRAY

GL_NORMAL_ARRAY

GL_FOG_COORDINATE_ARRAY

GL_TEXTURE_COORD_ARRAY

GL_FLAG_ARRAY

2. 指定数组

启用了顶点数组后,接下来要指定:哪一个数组是顶点数组。函数如下:

**void glVertexPointer( GLint size,

GLenum type,

GLsizei stride,

const GLvoid* pointer);**

参数:

size - 每个顶点的坐标数目,必须是2,3,或4。

type - 顶点坐标的数据类型,GL_SHORT, GL_INT, GL_FLOAT 或 GL_DOUBLE

stride - 两个相邻顶点之间的偏移量,单位为字节,如果为0,表面顶点是紧密存储的。

pointer - 数组中第一项的第一个坐标的内存地址。

此外,还有 glColorPointer、glIndexPointer等,用于指定别的数组。

使用方法如下:

GLfloat vertexs[] = {0.0f, 0.0f, 0.0f, 0.2f, 0.0f, 0.0f,
                    -0.2f, 0.0f, 0.0f, 0.0f, 0.2f, 0.0f,
                    0.0f, -0.2f, 0.0f, 0.0f, 0.0f, 0.2f,
                    0.0f, 0.0f, -0.2f};

GLubyte indexs[] = {0,1,2,3,4,5,6};

glEnableClientState(GL_VERTEX_ARRAY);   //启用顶点数组
glEnableClientState(GL_INDEX_ARRAY);    //启用索引数组

glVertexPointer(3,GL_FLOAT,0,vertexs);  //指定顶点数组
glIndexPointer(GL_UNSIGNED_BYTE,0,indexs);  //指定索引数组


3. 绘图

有三个函数用于绘图。

void glArrayElement( GLint i);

通过索引数组指定顶点,放在glBegin()和glEnd()之间。例如:

glBegin(GL_POINTS);
        glArrayElement(indexs[0]);
        glArrayElement(indexs[1]);
glEnd();


void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);

mode - 图元类型,例如 GL_POINTS、GL_LINES

count - 元素个数,索引数组存在indices中

type - 索引数组的数据类型,必须是GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, 或 GL_UNSIGNED_INT

indices - 索引数组

使用方法例如:

glDrawElements(GL_POINTS,7,GL_UNSIGNED_BYTE,indexs);


void glDrawArrays( GLenum mode, GLint first, GLsizei count);

对每个被启用的数组(顶点数组,颜色数组,索引数组),绘制从firstfirst+count-1的元素。类型为mode,例如GL_POINTS。

glDrawArrays(GL_POINTS,0,7);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: