用于图形应用的通用软件包称为计算机图形应用编程接口(CCAPI)它提供可以在C++等程序设计语言中用来创建图形的函数库。如第3 章所指出的,函数库可以分成几种类型。创建图形时最先要做的一件事就是要描述显示场景的组成部分。图形的组成部分可以是树木和地形家具和墙壁、商店铺面和街景、汽车和广告牌、原子和分子或者星星和银河。对于每一类场景要描述每一对象的结构及其在场景中的坐标位置。图形软件包中用来描述各种图形元素的函数称为图形输出原语(graphicsoutput primitive),或简称为图元(primitive)。描述对象几何要素的输出图元一般称为几何图元(geometric primitive)。点的位置和直线段是最简单的几何图元。图形软件包中另外的几何图元有圆和其他二次曲线、二次曲面、样条曲线和曲面及多边形填色区域。多数图形系统还提供某些显示字符串的函数。在选定的坐标系中指定一个图形的几何要素后,输出图元投影到与该输出设备显示区域对应的二维平面上,并扫描转换到帧缓存的整数像素位置。本章将介绍OpenGL中的输出图元并讨论它们的应用。第6章再讨论实现输出图元的设备级算法。
4.1 坐标系统
为了描述图形,必须首先确定一个称为世界坐标系的合适的二维或三维笛卡儿坐标系。接着通过给出世界坐标系中的位置等几何描述来定义图形中的对象。例如,通过两个端点定义一条直线段,通过一组顶点位置定义一个多边形。这些坐标位置与该对象的颜色、坐标范围(coordinate extent)即对象标y的最小值和最大值等其他信息一起存储在场景描述中。坐标范围也称为对象的包围盒(bounding box)。对于二维图形来说坐标范围也称为对象的包围矩形(bounding rectangle)。通过将场景信息传送给观察函数由观察函数识别可见面将对象映射到视频监视器上来实现对象的显示。扫描转换过程将颜色值等场景信息保存到帧缓存的相应位置,从而在输出设备上显示场景中的对象。
4.1.1 屏幕坐标
视频监视器上的位置使用与缓存中的像素位置相对应的整数屏幕坐标(screen coordinate)进行描述。像素的坐标值给出扫描行号(y 值)和列号(扫描行的 值)。屏幕刷新等硬件处理一般从屏幕的左上角开始对像素进行编址。从屏幕最上面的0行到屏幕最下面的某整数值行对扫描行进行编号,每一行中像素位置从左到右、从0到xm进行编号。但是使用软件命令可以按照任何方式设定屏幕位置的参考系统。例如,我们可以设定屏幕区域左下角为原点,用整数坐标(参见图4.1)或非整数笛卡儿坐标来描述图形。描述场景几何要素的坐标值由观察函数转换为顿缓存中的整数像素位置。
图元的扫描转换算法使用定义的坐标描述来确定要显示像素的位置。例如,给定一直线段的两个端点,其显示函数必须计算出两端点间位于线段上所有像素的位置。由于一个像素位置占有屏幕上的一个有限范围,因此实现算法必须考虑像素的有限大小。目前,我们假设每一整数屏幕位置代表像素区域的中心。(我们将在6.8节考虑其他的像素编址方法。一旦确定了一个对象的像素位置,必须将合适的颜色值存人帧缓存。为此,我们要使用一个底层函数
setPixel (x,y);
该函数将当前颜色设定值存入帧缓存的整数坐标位置(x,y)处该位置相对于屏幕坐标原点而选定。有时我们也希望获得一个像素位置的当前帧缓存设置。使用下列底层函数可以获得帧缓存的
颜色值:getPixel (x,y,color);在这一函数中参数color 得到一个与存储在位置(xy)的像素中的红色、绿色和蓝色(RGB)组合对应的整数值。
对于二维图形来说,仅需在(x,y)位置指定颜色值;但是对于三维图形来说,还需要其他的屏幕坐标信息。这时,屏幕坐标按三维值来存储,第三维表示对象位置相对于观察位置的深度。在二维场景中,深度值均为0。
4.1.2绝对和相对坐标描述
到目前为止,我们讨论的坐标均为绝对坐标(absolute coordinate)值。这表示指定的值是所在
坐标系统中的实际位置。
然而,有些图形软件包还允许使用相对坐标(relative cordinate)来描述位置。该方法在许多图形应用中很有用,比如用笔式绘图仪、艺术家绘画系统进行绘图及出版和印刷应用的图形软件包。使用这一方法,我们可以使用从离开最后一次引用的位置(称为当前位置,current position)的位移量来指定坐标位置。例如,如果位置(3,8)是应用程序刚刚引用的位置,则相对坐标描述(2,-1)与绝对位置(57)相对应。有一个函数专门用来在指定任何图元坐标前设定当前位置。在描述一串首尾相连的直线段场景时,我们可以在建立开始位置后仅给出一串相对坐标(位移)。图形系统中会给出指定位置时使用相对坐标还是绝对坐标的选项。在此后的讨论中,除非特别声明,我们假定都使用绝对坐标。
4.2OpenGL中指定二维世界坐标系统
第一个示例程序(在3.5 节讨论过了)介绍了 gluortho2D 命令,我们可以利用该命令设定一个二维笛卡儿坐标系。该函数的变量是指定显示图形的和y坐标范围的四个值。由于gluortho2D函数指定正交投影,因此我们也要确定坐标值放进了OpenCL投影矩阵中。此外,我们可以将世界坐标范围设定前的投影矩阵定义为一个单位矩阵。这样可保证坐标值不会受以前设置的投影矩阵的影响。因此,对于最初的二维例子,我们可以通过下列语句定义屏幕显示窗口的坐标系统:
g1MatrixMode (GL PROJECTION):
glLoadIdentity():
gluOrtho2D (xmin,xmax, ymin, ymax);
如图4.2所示,显示窗口被指定为其左下角位于坐标(xmin,ymin)处右上角位于坐标(xmax,ymax)处。
我们随后可使用gluortho2D语句描述的坐标系统来指定一个或多个要显示的图元。如果个图元的坐标范围完全在显示窗口的坐标范围内,则该图元将完整地显示出来。否则,仅仅在显示窗口坐标范围内的图元部分被显示。同样,在建立图形的几何描述时,所有 OpenGL图元的位置必须用gluortho2D函数定义的坐标系统中的绝对坐标给出。