您的位置:首页 > 其它

顶点数组

2011-08-11 20:45 127 查看
OpenGL提供了一个称之为顶点数组的工具,它扩展了数组的使用方式,可以显著地较少绘制立方体的函数调用次数。其主要思想是存储在数组中的信息可以被存储在客户端中,并通过单次函数调用来访问。

OpenGL为六种类型的数组提供了支持:顶点、颜色、颜色索引、法线、纹理坐标以及边标记。

顶点及颜色是我们接下去要使用的数组,我们通过对它们的使用来理解顶点数组。

使用顶点数组需要三个步骤:

1. 同OpenGL的其它功能一样,必须将其启用。

2. 必须指定数组的格式。

3. 用该数组绘制场景。

以顶点数组为例:

1. 定义一个二维顶点数组

static GLfloat Vertices[][3]= {

{-1.0,-1.0, 1.0},

{-1.0, 1.0, 1.0},

{1.0, 1.0, 1.0},

{1.0, -1.0, 1.0},

{-1.0,-1.0, -1.0},

{-1.0, 1.0, -1.0},

{1.0, 1.0, -1.0},

{1.0, -1.0, -1.0}

};

2. 根据使用顶点数组三个步骤中的第一步,调用函数

glEnableClientState(GL_VERTEX_ARRAY);

这样就启动了Vertex的顶点数组功能了。

3. 根据使用顶点数组三个步骤中的第二步,调用函数

glVertexPointer(3,GL_FLOAT,0,Vertices);

函数中,第一个参数提供了数组中列数,第二、三个参数提供了数组中每一个元素的数据类型,第四个参数就是该数组的首地址。仔细观察可以发现,上述的数组形式实质 上是对整个数组的一个描绘,从数组元素的数据类型、列数、首地址,可以说提供了对该数组的完整信息。这个函数的第一、二、三个参数就是对一个顶点的数据类型的描 述。

4. 定义对顶点的访问顺序索引

GLubyte CubeIndices[]= {

{0,3, 2, 1},

{2,3, 7, 6},

{0,4, 7, 3},

{1,2, 6, 5},

{4,5, 6, 7},

{0,1, 5, 4}

};

5. 根据使用顶点数组三个步骤中的第三步:绘制

void glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,CubeIndices);

该函数的第一个参数就是glBegin*中的那个绘制模式参数,第二个参数就是顶点数的绘制次数,第三、四个参数就是顶点索引数组的描述。

当然,该函数也可以进行如下形式的调用

for(int i=0;i<6;i++)

glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,CubeIndices);

我们来查看一下究竟上面的调用执行了上面,这有利于我们更好地理解顶点数组。

以glDrawElements(GL_POLYGON,4,GL_UNSIGNED_BYTE,CubeIndices)为例。

...

statici=0;

if(EnableColorArray())glColor3fv(Colors[i]);

//法线、纹理映射etc

……

glBegin(GL_POLYGON);

glVertex3fv(Vertices[i]);

……

glEnd();

i++;

小结:

顶点数组、颜色数组、法线数组……的关键步骤在于精确地定义,即写出二维数组、正确地描述出顶点数组及颜色数组……,同时写对了顶点的访问顺序,最后就是正确地调用

glDrawElements*函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: