计算机应用
COMPUTER APPLICATIONS
1999年 第19卷 第6期 Vol.19 No.6 1999



用OpenGL开发虚拟制造环境（一）
周杰韩　杜润生　吴波
　　摘　要　本文介绍了几何图形信息的数据结构、存储与显示基本原理。从应用程序角度论述Windows图形设备接口GDI的客户服务器本质及虚屏幕显示技术。最后讲述OpenGL图形库在虚拟制造仿真的应用基础。
　　关键词　虚拟制造，客户/服务器，OpenGL图形库
1　计算机图形
1.1　几何图形信息的数组结构
　　图形显示是从点的显示开始的。线段是所有在它上面的点的集合。几何学上的点是没有大小的。线段的显示实际上用有限个点来产生图形，因而每个点都有一定的大小。此时的点不再是真正的几何点，而是像素（图像基本元素）。每个像素是显示屏上可以编址的最小单元，也是在显示屏上能够被控制的最小部分。显示屏如同由像素组成的二维数组。每个像素对应数组的一个元素。每个像素有一个地址，对应数组的下标。像素亮度值对应元素值。设定显示屏上每一像素的亮度可以产生一幅图像。
1.2　几何图形信息的存储

图1　帧缓冲器与图像显示
　　一幅图像是由有限数量的像素组成。一个分辨率较高的显示设备若在x和y方向各有1000个像素，则这个显示屏将含有100万个像素。为了显示每一点的亮暗，每一像素至少需要1比特的亮度信息，其存储空间至少需要100万/8个字节。用来存储像素亮度数组的存储器称为帧缓冲器。帧缓冲器是指显视卡上的显视存储器。
1.3　几何图形信息的显示
　　光栅显示是用得较多的图形显示方法。光栅显示是利用扫描发生器每秒钟扫描帧缓冲器30到60次，将代表像素亮度的信息一行一行取出，然后送往显示器。帧缓冲器的存取地址与光栅扫描信号同步地产生。帧缓冲器的内容用来输出视屏信号控制阴极射线管电子束强度。强度大小决定像素的显示明暗。帧缓冲器地址用来输出水平与垂直偏转信号控制阴极射线管电子束的偏转。电子束的偏转决定像素的屏幕坐标（x，y）。每一次扫描帧缓冲器都使屏幕得到刷新。由于光栅显示系统利用直接存储器存取（DMA）硬件不断地扫描帧缓冲器，并把图形显示出来，因而图像生成不受中央处理器（CPU）控制。
1.4　显示设备驱动程序与应用程序的可移植性
　　应用中，应用程序编写的几何图形信息不是直接改变帧缓冲器的内容而是作为标准显示指令存入显示文件中，然后利用显示设备驱动程序解释显示指令以产生需要的图象。显示文件驱动程序形成图形应用程序与显示设备之间的接口。若应用程序可以产生标准显示文件代码，那么每个带有驱动程序的具体显示设备就能正确地运行应用程序，从而提高了应用程序的可移植性。显示设备与显示驱动程序通常由硬件商一起提供。
1.5　应用程序图形显示步骤
　　帧缓冲器数组直接与显示屏内容相对应，并且以亮度编码的形式保存了被显示的图形。图形应用程序的实现步骤包括：首先由初始化程序分配显示设备和存储器。其次应用程序把图形信息写入帧缓冲器，由帧缓冲器直接传送到显示设备。空帧缓冲器对应空白的显示屏。最后由结束图形程序释放显示设备包括重新分配存储器。
2　Windows环境下的图形显示
2.1　Windows环境下的虚屏显示
　　在MS-DOS应用中，图形和文本程序不仅常常直接写到视屏上，而且这样做时经常绕过BIOS屏幕调用。然而在Windows环境下避免了这种状况。首先在多任务Windows环境下物理视屏是一个共享资源。所有应用程序的显示活动，都必须通过Windows API函数来操作。任何试图绕过API函数都视为扰乱系统的行为。其次在Windows环境下屏幕操作根本不写到物理视屏上，即使使用API函数时也是这样。应用程序请求写文本或图形的操作，都是将信息写到虚拟屏幕也称为设备环境DC。最后Windows把虚拟屏幕映像到物理显示屏上。
2.2　图形用户接口（GDI）的客户/服务器本质
　　Windows将应用程序从具体输出设备中分离出来。在MS-DOS中，应用程序负责为所有输出设备编程。Windows应用程序不负责对输出设备编程。图形用户接口GDI为应用程序提供了一套独立于设备的标准绘图指令集。对于添加的新硬件，由硬件制造商提供驱动程序，而应用程序则通过GDI创建并维护设备环境（DC）。Win32应用程序在Windows95环境下都被分隔成了用户模式与核心模式。在用户模式下禁止直接取用图形设备资源，而是交给操作系统核心模式来完成。这种模式称为GDI的客户/服务器模式如图2。GDI的客户/服务器模式有效地将应用程序彼此分离，从而提高了Windows 环境的安全特性。而且任何访问输出设备的函数都留在GDI的服务器方，从而保证了入侵应用程序不能直接访问到其它应用程序的屏幕数据。

图2
3　OpenGL应用程序的图形支持
3.1　OpenGL图形软件在应用中的地位
　　OpenGL是SGI公司的IRIS GL图形工作站的分支。近年来，作为工业标准图形程序库，在CAD/CAM等需要高级的三维对象可视化和图形绘制领域得到广泛应用。OpenGL为应用程序员提供了程序和图形输入输出设备之间的功能接口，定义了一个独立于语言的图形核心系统。编写应用程序过程中，用符合语言的约定方式把OpenGL嵌入到相应的语言之中。OpenGL在图形应用中的地位如图3所示。由于OpenGL本身与硬件及操作系统的底层软件无关，从而使图形应用程序获得较高的可移植性。

图3
3.2　OpenGL客户/服务器图形显示方式
　　OpenGL通过客户/服务器方式实现图形显示。应用程序作为客户工作并调用OpenGL API。OpenGL客户模块同OpenGL服务模块通信并发出应用程序的OpenGL命令。OpenGL服务模块调用Win32设备驱动接口来使用驱动程序。一个OpenGL服务程序往往同时维护几个OpenGL环境。OpenGL环境是OpenGL客户 所处的OpenGL状态。OpenGL环境又叫着色环境，是OpenGL与Windows系统之间的桥梁。所有的OpenGL调用都通过着色环境来完成。OpenGL着色环境与设备环境有相同的像素格式。在为一个设备环境设置好了像素格式后就可以产生一个与之接近的着色环境。通过给出的设备环境，着色环境就可以在设备环境指出的设备上绘图。其逻辑模式如图4。

图4
　　用OpenGL去着色一个Windows窗口的典型操作过程如下：
　　. 建立正确的窗口格式；
　　. 建立像素格式；
　　. 创建设备环境；
　　. 创建一个着色环境；
　　. 将着色环境设为一个线程的当前着色环境；
　　. 线程进行有关OpenGL的初始化；
　　. 线程调用OpenGL着色函数；
　　. 当OpenGL处理结束后，将着色环境设为非当前使用的（断开与着色环境的联系）；
　　. 释放着色环境与设备环境。 
注：国家教委博士点基金资助。
作者简介：周杰韩　博士研究生。研究方向:虚拟制造、系统仿真、面向对象技术。
作者单位：华中理工大学机械科学与工程学院　湖北.武汉(430074)
收稿日期:1999-01-27(修改稿)
