顶点数组

来源:互联网 发布:百度推广调价软件 编辑:程序博客网 时间:2024/05/02 04:48

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*函数。
原创粉丝点击