目录
图形软件有两个大类:专用软件包和通用编程软件包。
专用图形软件包是为非程序员设计的,使得他们在某些应用中能用来生成图形、表格而不必关心显示所需的图形函数。
通用图形编程软件包提供一个可用于C、C++、Java或Fortran等高级程序设计语言的图形函数库。由于图形函数库提供了程序设计语言和硬件之间的软件接口,所以这一组图形函数称为计算机图形应用编程接口。
坐标表示
首先在各自的参照系中构造每一对象的形状,这些坐标系称为建模坐标系(局部坐标系、主坐标系)
一旦指定了单个物体的形状,我们可将对象放到称为世界坐标系的场景参照系中的适当位置。这一步涉及从单独的建模坐标系到世界坐标系的指定位置和方向的变换。
在描述好场景所有部分之后,要将该场景的世界坐标描述经各种处理变换到一个或多个输出设备参照系来显示。这个过程称为观察流水线。世界坐标系的位置首先转换到我们要对场景进行观察所对应的观察坐标系,该转换依据假想照相机的位置和方向来进行。然后,对象位置变换到该场景的一个二维投影,该投影对应于我们在输出屏幕上看到的结果。然后将该场景存入规范化坐标系(规范化设备坐标系,可使图形软件包与任何特定的输出设备的坐标范围无关),其坐标范围从-1到1或从0到1,这依赖于不同的系统。我们还要识别可见面并清除在显示设备上观察边界之外的图形部分(遮挡剔除)。最后,图形经扫描转换到光栅系统的刷新缓存中进行显示(光栅化)。
显示设备的坐标系称为设备坐标系,或对视频监视器而言称为屏幕坐标系。都是左手系,离开xy平面的正距离增加方向可解释为远离观察位置而去。
图形功能
图形的基本构造块称为图形输出图元。
属性是输出图元的特性。它描述了一个特定的图元是怎样显示出来的,包括颜色设定、线性或文本格式及区域填充图案等。
可以使用几何变换来改变场景中一个对象的大小、位置或方向。
某些图形包给出一组函数实现建模变换,将建模坐标系中给出的对象描述组织成场景。
观察变换用来指定将要显示的视图、使用的投影类型及在输出显示区域出现的范围。
输入函数用于控制和处理来自输入设备的交互流。
将处理事务性的任务(如显示屏变成指定颜色及对参数进行初始化)的功能归入控制操作类。
软件标准
标准化图形软件的最主要目标是可移植性。
图形函数定义为独立于任何程序设计语言的一组规范。语言绑定则是为特定的高级程序语言而定义的,它给出该语言访问各种图形函数的语法。
OpenGL简介
OpenGL基本函数库用来描述图元、属性、几何变换、观察变换和进行许多其他的操作。
基本OpenGL语法
OpenGL基本库(也成为OpenGL核心库)中的函数名要以gl为前缀,并且函数名中每一个组成词的第一个字母要大写。
符号常量均以GL开头。常量名中的每一个组成词均采用大写,单词之间用下划线_分隔开。
OpenGL中的数据类型
相关库
OpenGL实用函数库(OpenGL Utility, GLU)
Open Invertor 为交互式三维应用提供函数和预定义的对象形状
OpenGL的X窗口系统扩充(OpenGL Extension to the X Window System GLX)提供了支持计算机上的OpenGL函数的窗口系统库,函数以glX为前缀
Apple系统可使用Apple GL(ALG)接口进行窗口操作管理,函数以agl为前缀
WGL 函数提供了Windows到OpenGL的接口,以wgl为前缀
Presentation Manager to OpenGL(PGL) 是一个用于IBM OS/2的接口,使用pgl为前缀
OpenGL实用函数工具包(OpenGL Utility Toolkit, GLUT)提供了与任意屏幕窗口系统进行交互的函数库,以glut为前缀
一个完整的OpenGL程序
基本常用函数:
glutInit(&argc, argv);GLUT初始化
glutCreateWindow("An Example OpenGL Program");显示窗口在创建时给定的标题
glutDisplayFuc(lineSegment);在称为lineSegment的过程中有了线段的OpenGL描述,调用此函数就将线段描述推送到显示窗口
glutMainLoop();该函数必须是程序的最后一个。它显示初始图形并使程序进入检查鼠标或键盘等设备输入的无穷循环之中
glutInitWindowPosition(50 , 100); 用来给出显示窗口基于屏幕左上角的初始位置,以像素为单位
glutInitWindowSize(400,300);用来设定显示窗口的初始宽度和高度的像素数
glutInitDisplayMode函数来设定显示窗口的缓存和颜色模型等选项,例如:
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);指定使用单缓存和RGB颜色模型,也是默认的选项
#include <GL/glut.h>
void Init()
{
glClearColor(1, 1, 1, 0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0, 200, 0, 150);
}
void LineSegment()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0, 0.4, 0.2);
glBegin(GL_LINES);
glVertex2i(180, 15);
glVertex2i(10, 145);
glEnd();
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(50, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("AnExample OpenGL Program");
Init();
glutDisplayFunc(LineSegment);
glutMainLoop();
return 0;
}
OpenGL出错处理
GLenum ErrorCheck()
{
GLenum code;
const GLubyte *string;
code = glGetError();
if (code != GL_NO_ERROR)
{
string = gluErrorString(code);
fprintf(stderr, "OpenGL error: %s\n", string);
}
return code;
}
比较好的做法是在每一个显示回调子程序中至少检查依次出错情况。
总结
通常,图形设计软件包要求坐标描述在笛卡尔坐标系中给出。场景中的每个对象可定义在单独的建模笛卡尔坐标系中,然后映射到世界坐标系,并构造该场景。三维对象从世界坐标系投影到二维平面的规范化坐标系中,然后再变换到最终的显示设备坐标系。从建模坐标到规范化设备坐标的转换,是独立于应用中使用的特定设备的。设备驱动器则用于将规范化坐标变换到整数设备坐标。
图形软件包的函数可分为几类:输出图元、属性、几何和建模变换、观察变换、结构操作、输入函数、图形-结构操作和控制操作。
OpenGL系统由独立于设备的函数集(称为核心库)、实用库(GLU)和实用工具包(GLUT)三部分组成。在GLU的辅助函数集中有用来生成复杂对象、指定二维观察应用的参数及处理表面绘制操作和完成其他支持任务的函数。在GLUT中有大量的函数用来管理显示窗口、与屏幕窗口系统交互及生成某些三维锥体。