真实感图形是一种计算机图形生成技术,它首先采用数学方法建立所需三维场景的几何描述,然后根据假定的光照条件下计算画面上可见的各景物表面的光亮度,使观察者产生逼真的三维立体视觉效果。本文以空间曲面为例,讨论真实感图形显示技术,即借助于光照、浓淡、明暗技术,生成并显示具有立体感的空间曲面。它具备图像逼真、显示速度快、计算简便等特点,有一定的使用价值。
一、 空间曲面真实感图形显示
为显示空间曲面的真实感图形,我们必须逐个象素地计算曲面上各点的颜色。不但要考虑光源的性质、光源与该曲面的距离、曲面的形状等等,而且由于曲面通常包含成千上万个甚至上百万个象素,因此若考虑全面以求逼真度很高,但这样会使计算复杂、计算量太大,导致显示速度很慢,且编程实现困难。
笔者曾在本刊第1期介绍过“空间曲面三维实体图形显示技术”,先将曲面函数的定义域划分成若干个小区域,依此对每个小区域,绘制对应的封闭轮廓线,再用相应的色彩填充,从而完成曲面的三维实体图形显示。其实质是将曲面划分成若干各小曲面,不难想象,当定义域划分成若干个小区域的个数足够多,以致对应的小曲面足够小,其结果是显示的曲面具有真实感的立体效果。笔者将程序中N取为199,并且在填充多边形前设定画笔的颜色与画刷的颜色一致,运行的结果是曲面的立体效果很好。N越大,逼真度越高,但显示的时间就愈长。
二、空间曲面真实感图形生成与快速显示
虽然上述程序能达到较好的显示效果,但由于该程序频繁地设置画笔与画刷的颜色,使得显示速度太慢。为此,笔者采用扩展内存技术,先将所有要显示的数据送入扩展内存,然后再写入BMP格式的文件。在DOS下将扩展内存的数据直接送入显存,显示速度很快;在WINDOWS下显示BMP文件也是既易又快。
1.扩展内存XMS
扩展内存规范提供了对640K以上内存、非连接内存、非EMS内存的有控制的访问,允许应用程序共享内存而不发生冲突。Microsoft的HIMEM.SYS提供了XMS。
由XMS扩展内存规范给出的一组INT 2F功能调用如下:
l INT 2Fh—功能43h,子功能00h
作用:判断是否有XMS高端内存管理
软件。
调用寄存器:AX=4300h
返回寄存器:AL=80h 已安装XMS驱动程序,AL≠80h 无驱动程序
l INT 2Fh—功能43h,子功能10h
作用:获得XMS驱动程序的地址以便使用其功能。
调用寄存器:AX=4310h
返回寄存器:ES:BX->驱动程序入口点
说明:在AH设定为功能代码时做对驱动程序入口点的FAR调用。常用的有下面几个:
1. AH=08h 查询自由的扩展内存,返回:AX=最大的扩展内存块的K数;DX=总的扩展内存的K数。
2. AH=09h DX=需要的K数,分配扩展的内存块,返回:AX=0001h成功, DX=内存块的句柄;AX=0000h 失败。
3. AH=0Ah DX=要释放块的句柄,释放扩展的内存块,返回:AX=0001 h 成功;AX=0000h 失败。
4. AH=0Bh DS:SI->EMM结构(见下表),返回:AX=0001h 成功;
AX=0000h 失败。
表1 EMM结构的格式
偏移量 |
长度 |
内容 |
00h |
双字 |
要move的字节数 |
04h |
字 |
源句柄 |
06h |
双字 |
源块中的偏移量 |
0Ah |
字 |
目的块句柄 |
0Ch |
双字 |
目的块中的偏移量 |
注:要move的字节数必须为偶数;当源块(目的块)位于常规内存时,源句柄(目的块句柄)只能赋0值。
基于上述XMS扩展内存规范,本文用Turbo C给出一组存取扩展内存的函数。详见源程序。
2.区域的填充 由于本文采用扩展内存技术,先将所有要显示的数据送入扩展内存。在对划分的小曲面用相应的颜色填充时,无法调用现有的填充函数。事实上,待填充的小曲面均为四边形,针对这一特殊性,本文采用如下算法:首先依次得到四边形各边上各点的坐标,并按纵坐标的大小顺序将各点的横坐标存入数组,再连接纵坐标相等的各点。关于这纵坐标相等的各点,其实质是某一水平扫描线与该四边形的交点,交点的数目在1与4之间,程序按照数目的多少作相应的处理。
|