第九章 OpenGL
余敦辉湖北大学 数计学院
9.1 概述
OpenGL是一个功能强大的图形库,用户可以很方便地利用它开发出有多种特殊视觉效果(如光照,
纹理,透明,阴影)的三维图形。 OpenGL的前身是
SGI公司为其图形工作站设计的一个图形开发软件库
IRIS GL( Graphics Library),由于其性能优越,
因此受到了用户的一致推崇。 SGI公司有针对性地对
GL进行了改进,特别是扩展了 GL的可移植性,使之成为一个跨平台的开放式图形编程接口,这就是
OpenGL。
9.1 概述
1992年,OpenGL1.0版正式发布,并立即得到了迅速的应用推广。
1995年 12月,由 OpenGL ARB(Architecture Review Board—
体系结构评审委员会 )批准了 OpenGL1.1版本,这一版本的
OpenGL性能得到了加强,并引入了一些新特征,其中包括:
在增强元文件中包含 OpenGL调用,引进打印机支持,通过顶点数组的新特征,提高了顶点位置、法向、颜色及色彩指数、
纹理坐标、多边形边缘标志等的传输速度。
现在,OpenGL已经成为应用最为广泛的二维和三维图形编程接口。各种平台上利用 OpenGL开发的图形应用软件大量地涌现出来。
OpenGL的主要版本有 1.0,1.1,1.2和 1.2.1,其中以 1.1版最为常用。
9.1 概述
值得一提的是,由于 Microsoft公司在 Windows NT
中提供 OpenGL图形标准,OpenGL将在微机中广泛应用,尤其是 OpenGL三维图形加速卡和微机图形工作站的推出,人们可以在微机上实现三维图形应用,如 CAD设计、仿真模拟、三维游戏等,从而更有机会、更方便地使用 OpenGL及其应用软件来建立自己的三维图形世界。
OpenGL的特点
从程序开发人员的角度来看,OpenGL是一组绘图命令的 API集合。利用这些 API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。 OpenGL的 API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、象素、位图、
文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。
OpenGL的特点
1,应用广泛,广泛地应用于 CAD/CAM,三维动画、数字图象处理以及虚拟现实等领域 ; 无论是在 PC机上,还是在工作站甚至是大型机和超级计算机上,OpenGL都能表现出它的高性能和强大威力。
2,跨平台性,能够在几乎所有的主流操作系统上运行,包括 UNIX,Mac OS,OS/2,Windows NT,Windows9x,Linux等;
也能够与其中绝大多数的窗口系统一起工作。
3,高质量和高性能,无论是在 CAD/CAM,三维动画还是可视化仿真等领域,OpenGL高质量和高效率的图形生成能力都能得到充分的体现。
OpenGL的特点
4,出色的编程特性,良好的前瞻性、伸缩性和易使用性等也是 OpenGL的突出编程特点。
5,网络透明性,建立在客户 /服务器模型上的网络透明性是 OpenGL的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利用这种透明性能够均衡地共同承担图形应用任务的各工作站的负荷,也能使得没有图形功能的服务器能够使用图形工具。
OpenGL的 API结构
图 1-1(a)是 Win32平台上 OpenGL API的结构简图; (b)是 UNIX
平台上 OpenGL API的结构简图。
其中,OpenGL”表示 OpenGL基本 API,这类 API的主要功能包括物体描述、平移、旋转、缩放、光照、纹理、材质、象素、
位图、文字处理等。
,GLU”表示实用 API,其主要功能包括绘制二次曲面,NURBS
曲线曲面、复杂多边形以及纹理、矩阵管理等。
,WGL”是 Win32为支持 OpenGL而特别设计的一套编程接口;
,GLX”是 UNIX系统支持 OpenGL的编程接口。
为了实现与硬件平台无关,OpenGL不提供窗口管理、输入管理和事件响应机制,因此 OpenGL程序必须使用所在平台的用户接口(如 GDU和 Xlib)。
OpenGL的 API结构
OpenGL基本理解
OpenGL实际上是一种图形与硬件的接口。它包括了
120个图形函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。
OpenGL是一个高性能的图形开发软件包。 OpenGL支持网络,在网络系统中用户可以在不同的图形终端上运行程序显示图形。
OpenGL作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供描述类似于飞机、汽车、分子形状等复杂形体的图形操作函数。用户必须从点、线、面等最基本的图形单元开始构造自己的三维模型。
OpenGL工作流程
1),构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述。在三维空间上放置对象,选择有利的场景观察点。
2),计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。
3),光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。
OpenGL工作流程
其中几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过流程图的上部,包括运算器、
逐个顶点操作等;图像数据包括象素集、影像集、
位图集等,图像象素数据的处理方式与几何顶点数据的处理方式是不同的,但它们都经过光栅化、逐个片元( Fragment) 处理直至把最后的光栅数据写入帧缓冲器。在 OpenGL中的所有数据包括几何顶点数据和象素数据都可以被存储在显示列表中或者立即可以得到处理。 OpenGL中,显示列表技术是一项重要的技术。
OpenGL工作流程
OpenGL要求把所有的几何图形单元都用顶点来描述,这样运算器和逐个顶点计算操作都可以针对每个顶点进行计算和操作,然后进行光栅化形成图形碎片;对于象素数据,象素操作结果被存储在纹理组装用的内存中,再象几何顶点操作一样光栅化形成图形片元。
整个流程操作的最后,图形片元都要进行一系列的逐个片元操作,这样最后的象素值 BZ送入帧缓冲器实现图形的显示。
Windows NT下的 OpenGL函数
Windows NT下的 OpenGL同样包含 100多个库函数,
这些函数都按一定的格式来命名,即每个函数都以
gl开头 。 Windows NT下的 OpenGL除了具有基本的
OpenGL函数外,还支持其他四类函数:
相应函数 具体说明
OpenGL实用库 43个函数,每个函数以 glu开头 。
OpenGL辅助库 31个函数,每个函数以 aux开头 。
Windows专用库函数 6个函数,每个函数以 wgl开头 。
Win32 API函数 5个函数,函数前面没有专用前缀 。
OpenGL基本功能
模型绘制 ;
模型观察 ;
颜色模式的指定 ;
光照应用 ;
图象效果增强 ;
位图和图象处理 ;
纹理映射 ;
实时动画 ;
交互技术,
OpenGL简单例程
#include <GL/gl.h>
#include <GL/glaux.h>
#include "glos.h"
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
glFlush();
sleep(1000);
}
OpenGL简单例程
下面具体分析整个程序结构:
首先,在程序最开始处是 OpenGL头文件:
<GL/gl.h>,<GL/glaux.h>。 前一个是 gl库的头文件,后一个是辅助库的头文件。
此外,在以后的几章中还将说明 OpenGL的另外两个头文件,一个是 <GL/glu.h>实用库的头文件,
另一个是 <GL/glx.h>X窗口扩充库的头文件(这个常用在工作站上)。
OpenGL简单例程
接下来是主函数 main()的定义:一般的程序结构是先定义一个窗口:
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)设置窗口显示模式为 RGBA方式,即彩色方式,并且图形缓存为单缓存( SINGLE BUFFER)。 auxInitPosition(0,0,
500,500)定义窗口的初始位置,前两个参数 (0,0)为窗口的左上角点的屏幕坐标,后两个参数 (500,500)为窗口的宽度和高度。 auxInitWindow("simple")是窗口初始化,字符参数是窗口名称。
OpenGL简单例程
然后是窗口内清屏:
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
第一句将窗口清为黑色,第二句将颜色缓冲区清为 glClearColor(0.0,0.0,0.0,0.0)命令所设置的颜色,即同窗口背景颜色一致。
OpenGL简单例程
再接着是在窗口内画一个物体:
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
很明显,第一句设置物体颜色,函数中前三个参数分别为 R,G,B值,最后一个参数是 Alpha值,
范围都从 0至 1;第二句绘制一个二维矩形。
总而言之,OpenGL程序基本结构为定义窗口、清理窗口、绘制物体、结束运行。
OpenGL简单例程
再接着是在窗口内画一个物体:
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
很明显,第一句设置物体颜色,函数中前三个参数分别为 R,G,B值,最后一个参数是 Alpha值,
范围都从 0至 1;第二句绘制一个二维矩形。
总而言之,OpenGL程序基本结构为定义窗口、清理窗口、绘制物体、结束运行。