计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理

一个完整的OpenGL程序

        给出构成一个完整程序的所有部分之前还是有一些任务需要完成。对于显示窗口,我们可以选择背景颜色。我们需要组织一个过程来包含创建显示图形所必需的OpenGL 函数。

        要像图3.2 那样使用 RCB 颜色值将显示窗口的背景颜色设定为白色可以使用 OpenGL
函数:glclearColor (1.0,1.0,1.0,0.0);该函数前面的三个变量将红、绿、蓝三个颜色分量设定为1.0。这样就得到了白色背景的显示窗口。如果不是1.0,而是将这些颜色分量都设定为0.0,则得到熙色的背景。如果红、绿、蓝三分量的每一个设定为0.0到10之间的同一个值将得到某种灰色。glclearcolor 函数的第四个参数称为指定颜色的 a(alpha)值。a 值的一个用途是作为“调和”参数。在激活 OpenCL调和参数时,a值用来为两个重叠对象确定结果颜色。 值为0.0表示完全明的对象而 值为1.0表示不透明的对象。调和操作暂时不会使用,因此 值与我们前面提到的程序无关。现在,我们简单设定a值为00。
        尽管glclearColor 命令将某颜色赋给显示窗口,但它不能让显示窗口在屏幕上出现。要
使赋值的窗口得到显示,必须入下面的OpenGL函数:glclear (GL_COLOR BUFFER_BIT):变量GL_COLOR_BUFFER_BIT是一个OpenGL符号常量用来指定它是颜色缓存(刷新缓存)中的位值,该缓存将使用glclearColor 函数中指定的值来设定。(OpenGL有多个可以管理的级存,在第4章中将讨论其他缓存。)
除了设定显示缓存的背景色,还可以为要显示的场景中的对象选择各种颜色。对于最初的程序设计例子,我们简单地把对象颜色设定为深蓝色而把各种颜色选项的讨论放到第5章
glColor3f(0.0,0.4,0.2);
        glcolor函数的后缀3表示我们在指定三个 RCB 颜色分量时使用浮点数。该函数要求这些值必须在0.0到1.0的范围内,这里设定R=0.0G=0.4,而B=0.2。在第一个程序中,我们要显示一条简单的二维线段。为此需要告诉 penGL 怎样将图形投影到显示窗口中,因为在 OpenGL 中把生成二维线段看成生成三维线段的特例。因此,尽管我们只要生成很简单的二维线段,OpenGL 还是采用完整的三维观察操作来处理该图形。我们可以使用下面两个函数来设置投影类型(模式)和其他观察参数

g1MatrixMode (GLPROJECTION):

gluOrtho2D (0.0,200.0,0.0150.0):

这表示使用正投影将世界坐标系二维矩形区域的内容映射到屏幕上,区域的 x 坐标值从0.0到200.0,y坐标值从0.0到150.0只要是在该矩形内定义的对象,都会出现在显示窗口中。任何在坐标范围外的内容都不会显示出来。因此,GLU 数gluortho2D 定义了显示口以(0.00.0)为左下角、以(200.0150.0)为右上角。由于我们仅仅描述了一个二维对象,正投影只是将前面定义的图形“贴”到显示窗口中。现在使用与显示窗口具有一样纵横比的世界坐标矩形,从而使图形不产生变形。后面将考虑如何在不依赖显示窗口描述的情况下保持纵横比。最后,要调用合适的函数来建立线段。下面的程序定义了一个从整数笛卡儿端点坐标(18015)到(10145)的二维直线段第4 章将给出这些函数及用来生成图元的其他OpenGL 函数的详细解释。

现在,我们已经可以将各部分组合起来。下面的 OpenGL序按三个过程来组织。将所有初始化和有关的一次性的参数设定放在函数 nit 中。要显示图形的几何描述放在函数lineSegment中,该过程将由GLUT函数glutDisplayFunc 调用。函数main包含设定显示窗口及将线段送到屏幕的 GLUT 函数。图3.3给出了由该程序生成的显示窗口及线段。

计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理_第1张图片

 过程 lineSegment的最后是函数glFlush我们还未讨论它。该函数强制执行由计算机系统存放在缓存中不同位置的OpenGL函数,其位置依赖于OpenGL的实现。例如在繁忙的网络中,可能因处理某些缓存而出现延缓现象,但glFlush 的调用将强制清空所有缓存来处理OpenGL函数。
描述图形的函数lineSegment称为一个显示回调函数(display callback function)。该函数由glutDisplayFunc 作为在显示窗口需要重新显示时引人的函数来“注册”。例如,显示窗口移动时会出现这种情况。在后面几章中,我们将看到其他类

计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理_第2张图片

        型的回调函数及辅助的对它们注册的 GLUT 函数。 图3.3 由示序生成的显示窗口和线段一般情况下,OpenGL程序组织成一组在一定行为发生时的回调函数的集合。

OpenGL的出错处理

        用它们的程序员。因而,我们宁愿相信,我们的 OpenCL 程序有可能(如果不是经常)包含错误。
        所以,有必要花费一些时间来讨论 OpenGL程序的出错处理。OpenGL和GLU记录错误的方法比较简单。当OpenGL发现在对基本库子序或GLU子序的一次调用中有错误时,就在内部记录一个出错编码,而造成出错的子程序被忽略(因此该错误不影响 OpenGL的内部状态,也不影响帧缓存的内容)。但是OpenGL每次只记录一个出错编码。一旦出现一个出错编码,在你的程序明确查询 OpenGL出错状态之前不会再记录另外的出错编码:
        GLenum code;
        code = glGetError ():
        该调用返回当前的出错编码并清除内部出错标志。如果返回的值等于OpenGL符号常数GL_NOERROR,则什么事也没有。任何其他返回值都表示出现问题。OpenGL基本库定义了一些代表各种出错编码的符号常数;表3.1列出了经常出现的一些符号常数。GLU库也定义了一些出错编码,但其中多数都使用没有什么意义的名字,比如         GLUNURBS_ERROR1GLU_NURBS_ERROR2,

等等。(实际上这些名字也不是一点意义都没有,但是在后面几章讨论更新的概念之前,它们的意义并不明显。

计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理_第3张图片

这些符号常数是有帮助的,但直接打印出来并不提供特别的信息。幸而,GLU 库包含有一个函数,可以为每个 GLU和GL 错误返回一个描述性字符串,并将其作为一个参数传递给该函数。返回值可以使用C语言的标准库函数 fprintf 来打印,例如:
 

计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理_第4张图片

gluErrorString返回的值指向位于GLU库内部的一个字符串。这不是一个动态分配的字符串,所以不能由我们的程序重新分配。同样也不能由我们的程序对其进行修改(因而有字符串声明的常数修改器)。
我们可以很容易将这些函数嵌人程序的通用出错报告函数中。下面的函数用来获取当前出错编码、打印描述性出错字符串并返回调用子程序的编码:

计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理_第5张图片计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理_第6张图片

        我们鼓励按上面的方式开发OpenGL程序。比较好的做法是在每一个显示回调子程序中至少检查一次出错情况,当你使用一个未使用过的功能时,或当你在程序生成的图像中看到不正常或非预期的结果时,常常需要安排出错检查。

 

你可能感兴趣的:(计算机图形学,计算机图形学)