OpenGL从1.0开始-顶点数组简析

来源:互联网 发布:java pc端开发 编辑:程序博客网 时间:2024/06/05 13:35

相信大家在之前的代码实现中已经被频繁的点坐标指定函数所折磨,同样,我们的计算机也对大量的函数调用和资源请求所拖累而减缓了图形程序的执行。下面我们可以看看一个执行正方形渲染的代码段(详细代码以后补充)

typedef GLint vertex3[3];vertex3 pt[8] = { { 0, 0, 0 }, { 0, 1, 0 }, { 1, 0, 0 }, { 1, 1, 0 }, { 0, 0, 1 }, {0, 1, 1}, { 1, 0, 1 }, { 1, 1, 1 } };void quad(GLint n1, GLint n2, GLint n3, GLint n4){    glBegin(GL_QUADS);    glVertex3iv(pt[n1]);    glVertex3iv(pt[n2]);    glVertex3iv(pt[n3]);    glVertex3iv(pt[n4]);    glEnd();}void cube(){    quad(6, 2, 3, 7);    quad(5, 1, 0, 4);    quad(7, 3, 1, 5);    quad(4, 0, 2, 6);    quad(2, 0, 1, 3);    quad(7, 5, 4, 6);}

在使用传统的立即模式(后面会专门开篇讲解)绘图的情况下,一个正方体需要指定六个面,每个面需要六个OpenGL函数,再加上颜色描述和其他参数指定函数,仅仅显示一个正方形就可能需要上百个OpenGL函数调用。为了简化该问题,OpenGL提供了顶点数组的机制来减少处理坐标信息的函数调用数量。代码段如下:

glEnableClientState(GL_VERTEX_ARRAY);//激活OpengL顶点数组特性glVertexPointer(3, GL_INT, 0, pt);//指定顶点坐标位置和数据格式GLubyte vertIndex[] = { 6, 2, 3, 7, 5, 1, 0, 4, 7, 3, 1, 5, 4, 0, 2, 6, 2, 0, 1, 3, 7, 5, 4, 6 };//指定顶点索引的数组glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, vertIndex);//场景描述

第一条命令glEnableClientState(GL_VERTEX_ARRAY)激活了客户端中参数指定的能力,相应地可以使用命令glDisableClientState(GL_VERTEX_ARRAY)来使其无效。
第二条命令glVertexPointer(3, GL_INT, 0, pt)提供对象顶点坐标的位置和格式。第一个参数3指出每一个顶点描述中的坐标数目,第二个参数OpenGL符号常量GL_INT指定顶点坐标的数据类型,第三个参数给出连续顶点之间的字节位移(以后详述),第四个参数指向包含坐标值的顶点数组。
命令glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, vertIndex)使用一个函数调用完成了整个立方体所有面的显示,其中第一个参数表示需要显示的图元常量,第四个参数vertIndex存放了立方体顶点的所有索引,其中每一个索引的对应于glVertexPointer中指定的顶点坐标数组pt的下标。因为一个正方体有6个面,每个面4个顶点,总共需要24个顶点,所以我们在第二个参数中指定顶点总量24,。这样glDrawElements每次绘制四边形依序取出4个顶点来显示一个立方体面。第三个参数指定给出索引值的类型。我们还将在后面的文章中给大家介绍在顶点数组中指定颜色值等其他属性的方法。

原创粉丝点击