计算机图形学(二)输出图元_10_多边形填充区_8_OpenGL顶点数组

OpenGL顶点数组

尽管前面给出的例子中只包含少量的坐标位置,但描述包含若干个对象的场景一般会复杂得多。我们先考虑描述一个简单的很基本的对象:图3.58中的单位立方体,为简化后面的讨论而使用了整数坐标。定义顶点坐标的直接方法是用一个双下标数组,例如:

GLint points [8][3] = {{0,0,0},{0,1,0},{1,0,0},{1,1,0},{0,0,1},{0,1,1},{1,0,1},{1,1,1}};

也可以先定义一个三维顶点位置的数据类型,然后给出作为单下标数组元素的每一顶点位置的坐标,

例如:

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}};

下面要定义该对象的六个面。为此,分六次调用glBegin (GL_POLYGON}或glBegin(GL_QUADS)。我们必须明确每一个面的顶点顺序符合从立方体外部对其观察时为逆时针次序的要求。在下面的程序段中,我们指定每个立方体面为一个四边形,并且使用一个函数调用将数组下标值传给OpenGL图元子程序。图3.59给出了与立方体顶点位置对应的数组pt的下标值。

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函数调用。而有许多复杂对象的场景会需要更多的函数调用。

从上面的例子中可以看出,复杂的场景描述需要使用几百或几千个坐标描述。另外还必须为各个对象建立各种属性和观察参数。因此,对象和场景描述要使用大量的函数调用,这对系统资源提出了要求并减慢了图形程序的执行。复杂显示进一步的问题是对象表面(如图3.58中的立方体)通常有共享顶点。使用已讨论过的方法,这些共享顶点需要多次指定。

为了简化这些问题,OpenGL提供了一种机制来减少处理坐标信息的函数调用数量。使用顶点数组(vertex array ),可以利用很少的函数调用来安排场景的描述信息。步骤如下:

1.引用函数glEnableClientState (GL_VERTEX_ARRAY)激活OpenGL的顶点数组特性。

2.使用函数glVertexPointer指定顶点坐标的位置和数据格式。

3.使用子程序如glDrawElements显示场景,该子程序可处理多个图元而仅需少量的函数调用。

使用前面定义的pt数组,实现下列程序示例中的三步。

glEnableClientState (GL_VERTEX_ARRAY);
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, verIndex);

    第一条命令glEnableClientState (GL_VERTEX_ARRAY),激活了客户/服务器系统中客户端的能力(此时是顶点数组)。因为客户端(运行主程序的机器)保留图形的数据,顶点数组必须在那里。如第2章所指出的,服务器(如工作站)发出命今并显示图形。当然,单个计算机既是客户端又是服务器。OpenGL的顶点数组特性用下列命令来使其无效。

glDisableClientState (GL_VERTEX_ARRAY);

     接下来为函数glVertexPointer提供对象顶点坐标的位置和格式。glVertexPointer的第一个参数在此例中为3,指出每一个项点描述中的坐标数目。顶点坐标的数据类型用函数中第二个参数OpenGL符号常量来指定。此例中数据类型为GL_INT。另外的数据类型用符号常量GL_BYTE、GL_ SHORT、GL_FLOAT和GL_DOUBLE来指定。第三个参数用来给出连续顶点之间的字节位移。这一参数的目的是允许多种类型的数据(如坐标和颜色)捆绑在同一个数组内。由于我们仅给出坐标数据,所以为这个位置参数赋值为0。函数glVertexPointer的最后一个参数指向包含坐标值的顶点数组。

立方体顶点的所有索引存放在数组vertIndex中。其中每一个索引是对应于该顶点值的数组pt的下标。该索引表被当做函数glDrawElements的最后一个参数,并由显示立方体的四边界表面的第一个参数是图元GL_QUADS使用。第二个参数指定数组vertIndex中的元素数量。因为一个四边形有4个顶点,所以我们指定24 , glDrawElements函数每次取出4个顶点来显示一个立方体面,直到24个顶点用完。这样,使用一个函数调用完成了整个立方体所有面的显示。glDrawElements函数的第三个参数给出索引值的类型。因为此时所用的索引是小整数,我们指定其为GL_UNSIGNED_BYTE类型。另外两种可用的索引类型是GL_UNSIGNED_SHORT和GL_UNSIGNED_INT

也可将其他的信息与坐标值一起放进顶点数组中用于场景描述。我们可以在数组(由函数glDrawElements引用)中指定对象的颜色值和其他属性。为了提高效率,可以交替使用各种数组。下一章将讨论实现这些属性的方法。

时间: 2024-10-20 06:33:05

计算机图形学(二)输出图元_10_多边形填充区_8_OpenGL顶点数组的相关文章

计算机图形学(二)输出图元_10_多边形填充区_7_OpenGL多边形填充区函数(上)

OpenGL多边形填充区函数(上) 描述填充多边形的OpenGL过程与描述点和折线类似,但有一个例外.函数glVertex用来输入多边形的一个顶点坐标,而完整的多边形用从glBegin到glEnd之间的一组顶点来描述.但有另外一个函数可以用来显示具有完全不同格式的矩形. 默认时多边形内部显示为单色,由当前颜色设定确定其颜色.作为选项(下面的内容中叙述),可以用图案填充多边形且显示多边形的边作为内部填充的边界.函数glBegin中指定多边形填充区的变量可使用6个不同的符号常量.这6个基本常量可用来

计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别

多边形填充区 一个多边形(polygon)在数学上定义为由三个或者更多称为顶点的坐标位置描述的平面图形,这些顶点由称为多边性的边(edge或者side)顺序连接.进一步来看,几何上要求多边形的边除了端点之外没有其他公共点.因此,根据定义,一个多边形在其单一平面上必须有其所有的顶点且边之间无交叉.多边形的例子有三角形.矩形.八边形和十六边形等.有时,任一有封闭折线边界的平面图形暗指一个多边形,而若其没有交叉边则称为标准多边形(( standard polygon)或简单多边形( simple po

计算机图形学(二)输出图元_10_多边形填充区_3_内-外测试

内-外测试 各种图形处理经常需要鉴别对象的内部区域.识别简单对象如凸多边形.圆或椭圆的内部通常是一件很容易的事情.但有时我们必须处理较复杂的对象.例如,我们可能描述一个图3.46所示的有相交边的复杂填充区.在该形状中,xy平面上哪一部分为对象边界的"内部".哪一部分为"外部"并不总是一目了然的.奇偶规则和非零环绕规则是识别平面图形内部区域的两种常用方法. 奇偶规则(odd-even rule)也称奇偶性规则(odd-parity rule)或偶奇规则(even-od

计算机图形学(二)输出图元_10_多边形填充区_4_多边形表

多边形表 场景中的对象一般用一组多边形面片来描述.实际上,图形软件包经常提供以多边形网格形式描述表面形状的函数.对每一个对象的描述包括指定多边形面片的几何信息和其他表面参数(如颜色.透明性及光反射特性).在输入每个多边形的信息时,数据放进一些表格中等待后续处理.显示和场景的对象管理.这些多边形数据表分成两组来组织:几何数据表和属性数据表.几何数据表包含顶点坐标和标识多边形面片空间方向的参数.对象的属性信息包含指定对象的透明程度及其表面的反射性能和纹理特征. 场景中对象的几何数据简单地组织为三张表

计算机图形学(二)输出图元_10_多边形填充区_2_分割凹多边形

分割凹多边形 一旦识别出凹多边形,我们可以将它切割成一组凸多边形.这可使用边向量和边叉积来完成.我们可以利用顶点和边延长线的关系来确定哪些顶点在其一侧,哪些顶点在另一侧.在下面的算法中我们假定所有多边形均在xy平面上.当然,在世界坐标系中描述的多边形的初始位置可能不在xy平面上,但我们可以使用第5章的讨论的变换方法将它们移到xy平面上.对于分割凹多边形的向量方法(vector method),我们首先要形成边向量.给定相继的向量位置Vk和Vk+1定义边向量: 接着按多边形边界顺序计算连续的边向量

计算机图形学 复习笔记

计算机图形学 复习笔记 (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341) 第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象的客观对象 包括自然景物.拍摄到的图片.用数学方法描述的图形等等 图形的要素 几何要素:刻画对象的轮廓.形状等 非几何要素:刻画对象的颜色.材质等 图形表示法 点阵表示 枚举出图形中所有的点,简称为图像. 参数表示 由图形的

计算机图形学(二)输出图元_20_章节总结(上)

输出图元章节总结 发了好久第2章终于结束了,本章中讨论的输出图元为使用直线.曲线.填充区域.单元阵列样式和文本构造图形提供了基本的工具.我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元. 用于沿线段路径绘制像素的三种方法是DDA算法.Bresenham算法和中点算法,Bresenham算法和中点算法是等同的并且是最有效的.沿线段路径的像素的颜色位存储按照递增地计算内存地址的方式而有效完成.任何线段生成算法都可以通过分割线段并将分割的线段分布到可用处理器上来获得并行的实现. 圆和椭圆采用中点算

计算机图形学 有效边表填充算法(6)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40154077 本文通过一个完整的实例,展示多边形有效边表填充算法. 1)创建CAET类 头文件:AET.h // AET.h: interface for the CAET class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_AET_

计算机图形学和OpenGL(二)坐标系和绘制点线函数

这节开始前我们先了解一下图元的概念.图形软件包中用来描述各种图形元素的函数称为图形输出原语,也称图元(primitive).而描述对象几何要素的输出图元一般称为几何图元.点和线是最简单的几何图元,本节就会简单介绍点和线段的绘制方法. 一.坐标系统. 坐标系统一般分为屏幕坐标和OpenGL中的绘图坐标. 在上一节中我们简单的写了个示例程序,程序中介绍了gluOrtho2D命令.我们可以利用该命令设定一个二维笛卡尔坐标系.该函数的四个变量制定的是显示图形x和y坐标范围.所以我们可以使用下面代码制定一