输出图元章节总结 发了好久第2章终于结束了, 本章中讨论的输出图元为使用直线、曲线、填充区域、单元阵列样式和文本构造图形提供了基本的工具。我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元 。 用于沿线段路径绘制像素的 三种方法 是 DDA算法、Br
发了好久第2章终于结束了,本章中讨论的输出图元为使用直线、曲线、填充区域、单元阵列样式和文本构造图形提供了基本的工具。我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元。
用于沿线段路径绘制像素的三种方法是DDA算法、Bresenham算法和中点算法,Bresenham算法和中点算法是等同的并且是最有效的。沿线段路径的像素的颜色位存储按照递增地计算内存地址的方式而有效完成。任何线段生成算法都可以通过分割线段并将分割的线段分布到可用处理器上来获得并行的实现。
圆和椭圆采用中点算法并根据其对称性进行有效而精确的扫描转换。其他二次曲线(抛物线和双曲线)也可以使用类似的方法进行绘制。分段的连续多项式的样条曲线广泛地应用于动画和计算机辅助设计中。曲线生成的并行实现能通过与并行线段处理方法类似的方法来实现。为了考虑显示直线和曲线具有有限宽度的事实,我们必须调整对象的像素大小,使之与指定的几何尺寸相一致。可以通过将像素位置看做在左下角的编址方法,或是通过调整直线长度的方法来实现。
一个填充区是一个显示成单色或彩色图案的平面区域。但一般来说,我们可以用任何边界来指定填充区。很多图形软件包仅允许凸多边形填充区。这时,凹多边形填充区可以通过分割成一组凸多边形来显示。三角形是最容易填充的多边形,因为每条扫描线只和三角形的两条边相交(假定扫描线不和三角形顶点相交)。
奇偶规则可用来判定平面区域的内点。其他一些方法也可用于定义对象内部,特别是不规则的自相交对象。一个有代表性的例子是非零环绕数规则。该规则比奇偶规则在处理用多个边界定义的对象时更加灵活。我们还可以根据环绕数规则的变形,使用布尔操作来组合平面区域。
每一多边形都有确定多边形平面空间方向的前向面和后向面。该空间方向可用与多边形平面正交的法向量来确定,并且从后向面指向前向面。可以从多边形平面方程或使用平面上逆时针排列且其三个夹角均小于180度的三点求向量叉积来计算法向量的分量。一个场景的所有坐标值、空间方向和其他几何数据分别放入顶点、边和面片表中。
图形软件包中其他一些可用的图元有图案阵列和字符串。图案阵列可用于描述各种二维形状,包括使用矩形结构的二值或彩色值集合表达的字符集。字符串用来为图形提供标记。
使用OpenGL基本库中的图元函数可生成点、直线段、凸多边形填充区和位图或像素图的图案阵列。GLUT中有显示字符串的子程序。圆、椭圆和凸多边形填充区等其他图元能利用这些函数构造或逼近,也可利用GLU和GLUT的子程序生成。所有坐标值在右手笛卡儿坐标系统中用绝对坐标表示。描述场景的坐标位置可在二维或三维参考系中给出。可以用整数或浮点数来给出坐标值,也可用指向坐标值数组的指针来表示位置。场景描述经观察函数变换成视频监视器等输出设备的二维显示。除glRect函数外,顶点、线段或多边形的每一位置均在glVertex函数中指定。定义每一图元的一组glVertex函数用一对语句glBegin/glEnd来包含,其中的图元类型根据作为glBegin函数的变量的符号常量来标识。在描述包含许多多边形填充表面时,可以使用OpenGL顶点数组来指定几何和其他数据,从而高效地生成显示结果。
下面,列出OpenGL中生成输出图元的基本函数。某些相关子程序也在其中。
函数 描述
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- gluOrtho2D 指定二维世界坐标系统
- glVertex* 选择一坐标位置。该函数必须放在glBegin/glEnd之间
- glBegin (GL_POINTS); 绘出一个或多个点,每个都在glVertex 函数中指定。该位置串用glEnd语句来结束
- glBegin (GL_LINES); 显示一组直线段,其端点坐标在glVertex函数中指定。该端点串最后由glEnd语句来结束
- glBegin (GL_LINE_STRIP); 显示用与GL_LINES相同的结构所指定的折线
- glBegin (GL_LINE_LOOP); 显示用与GL_LINES相同的结构所指定的封闭折线
- glRect* 显示xy平面上的一个填充区
- glBegin (GL_POLYGON); 显示一个填充多边形,其顶点在glVertex中给出且由glEnd语句结束
- glBegin (GL_TRISNGLE_STRIP); 显示一个填充三角形带,其描述结构与GL_POLYGON相同
- glBegin (GL_TRIANGLE_FAN); 显示一扇形的填充三角形带,所有三角形都与第一顶点相连,其描述结构与GL_POLYGON相同
- glBegin (GL_QUADS); 显示一组填充四边形,其描述结构与GL_POLYGON相同
- glBegin (GL_QUAD_STRIP); 显示一组填充四边形带,其描述结构与GL_POLYGON相同
- glEnableClientState (GL_VERTEX_ARRAY); 激活OpenGL的顶点数组设施
- glVertexPointer (size,type,stride,array); 指定一坐标值数组
- glDrawElements (prim,num,type,array); 从数组数据中显示一指定图元类型
- glNewList (listID,listMode); 把一组命令定义为一个显示表,用glEndList语句结束
- glGenLists 生成一个或多个显示表标识
- glIsList 确定一显示表标识是否被使用的查询函数
- glCallList 执行一个显示表
- glListBase 指定显示表标识数组的位移
- glCallLists 执行多个显示表
- glDeleteLists 删除指定的一串显示表
- glRasterPos* 为帧缓存指定一个二维或三维的当前位置。该位置用来作为位图和像素图图案的参考
- glBitmap(w, h, x0, y0, xShift, yShift, pattern); 指定要映射到与当前位置对应的像素位置的位图图案
- glDrawPixels(w, h, type, format, pattern); 指定要映射到与当前位置对应的像素位置的像素图图案
- glDrawBuffer 选择存储像素图的一个或多个缓存
- glReadPixels 将一块像素存人指定的数组
- glCopyPixels 将一块像素从一个缓存复制到另一个
- glLopicOp 在用常量GL_COLOR_LOGIC_OP激活后选择一种逻辑操作来组合两个像素数组
- glutBitmapCharacter (font, char); 选择一种字体和一个位图字符进行显示
- glutStrokeCharacter (font, char); 选择一种字体和一个轮廓字符进行显示
- glutReshapeFunc 指定显示窗口尺寸改变时的工作