基于 OpenGL 的三维曲面数据场动态显示
摘 要 在大数据量条件下,实时动态显示三维曲面较困难,其关键在于提高三维图形数
据处理和图形绘制速度。通过对基于图形 工业 标准 OpenGL 实现三维曲面动态显示的原
理和 方法 的讨论,提出采用 OpenGL 的双缓存、显示列表技术,大幅度提高了图形数据
处理和刷新速度,保证了每帧数据图形绘制的连续性和完整性,成功实现了三维曲面数据
场实时动态显示。 关键词 OpenGL 三维曲面 动态显示论文联盟 编
辑。 1 引言 在某三维数据场中,数据随时间的变化而发生变化,为直观观察数据随时
间变化的态势,需对数据场的变化实时动态显示。利用网格曲面显示三维数据场是一种直
观的方法,但需经过数据插值、投影、曲面拼接、消隐等处理后方可绘制图形, 计算 量
较大。在数据量较大的情况下,实时动态显示三维曲面图形较困难,其关键在于提高每帧
图形处理和绘制刷新速度,以保证每帧三维曲面显示时的连贯性和完整性。 OpenGL 是
性能卓越的图形处理工具,采用 OpenGL 双缓存和绘图操作予编译技术,较好解决了三维
图形数据处理和绘图刷新速度 问题 。利用 Visual C++调用 OpenGL 的三维图形编程接口
成功实现了大数据量的三维曲面图形的实时动态显示。2 基于 OpenGL 的三维曲面动态显
示原理 基于 OpenGL 三维曲面图形显示原理 OpenGL 是独立于操作系统的开放式三
维图形软件接口。其主要功能是将三维曲面通过顶点序列或像素点进行描述,并进行相应
的透视、光照、纹理操作,最终转换成帧缓存中的图像数据,利用该图像数据进行三维曲
面图形的着色。三维曲面图形显示归纳为以下几个步骤: (1)在三维场景中建立曲面
绘制的模型。选用插值方法、参数曲面函数,计算曲面控制点,进行曲面重构; (2)
设置视点和透视方式; (3)进行消隐、光照、纹理、明暗处理; (4)绘制场景,
输出到屏幕窗口。图 1 三维曲面图形显示基本流程 利用双缓存实现动态显示原理
三维曲面动态显示需要连续地绘制三维曲面并显示场景,用不同的曲面数据刷新屏幕视
窗。 在 OpenGL 中利用双缓存技术,分配两个帧缓存区,在连续显示三维曲面时,一个
帧缓冲区中的数据执行绘制曲面命令的同时,另一个帧缓存区中的数据进行图形显示。当
前可见视频缓存称为前台视频缓存,不可见的正在绘图的视频缓存称为后台视频缓存。当
后台视频缓存中的数据要求显示时,OpenGL 就将它拷贝至前台视频缓存,显示硬件不断
地读可见视频缓存中的 内容 ,并把结果显示在屏幕上。 应用 双缓存,每一帧三维曲
面只在绘制完成之后才显示出来,所以观察者可以看到每一帧完整三维曲面,而不是曲面
的绘制过程。 使用双缓存实现三维曲面动态显示的步骤如下: (1)设置 OpenGL 窗
口显示属性为双缓存机制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA); (2)利用
OpenGL 基本绘图命令绘制三维曲面; (3)一帧曲面绘图结束后缓存拷贝,切换缓存
:auxSwapBuffers();SwapBuffers(wglGetCurrentDC()); 利用显示列表提高程序运行效率
显示列表是一组预先存储起来留待以后调用的函数语句。调用显示列表时就按次序执行
其中的函数。显示列表将反复执行的绘图操作以编译好的命令方式进行存储,设计成命令
的高速缓存,而不是动态的数据库缓存,所以可以优化程序运行性能。实现和调用显示列
表的方法: (1)创建列表: void glNewList(Gluint list,Glenm
mode); void glBegin(Glenum mode); void glEnd(void); void glEndList(); (2)调
用列表: void glCallList(Gluint list);3 基于 OpenGL 的三维曲面动态显示实现 在使用
Visual C++的 MFC AppWizard 建立应用程序框架后,生成了多个类,与 OpenGL 编程相关
的类是视图类,主要的显示任务都在其中完成。 基于 OpenGL 绘图的基本设置
设置必要的编译链接环境 OpenGL 的图形编程接口包括的主要函数和库函数被封装在
动态链接库中,因此在项目中要添加 、 和 三个库。同时
在应用程序的视类头文件中加入 OpenGL 头文件说明: #include "gl\" #include
"gl\" #include "gl\" 设置像素格式 该部分设置绘图所需的像素格式
,Windows 下采用 PIXELFORMATDESCRIPTOR 结构设置像素格式,该结构包含 26 个属性
信息,包含了颜色位数、颜色模式、缓存的位数和操作方式,以及是否采用双缓存机制等
。 创建着色描述表 OpenGL 应用程序的设备描述表(DC)称为着色描述表,由它
通知 Windows 在窗口中绘制图形。应用程序必须在绘图之前调用专用函数
wglCreateContext()创建自己的着色描述表,调用 wglMakeCurrent()使其当前化,退出
OpenGL 时使着色表非当前化。 创建三维曲面的观察场景 OpenGL 一般用函数
glFrustrum()和 glViewport()实现投影变换和视口变换。glFrustrum()定义了一个容纳绘制对
象的最大空间区域,即视景体,位于视景体以外的部分都会被剪切掉;glViewport()则定义
了一个绘制场景的矩形区域,即视口,用来把场景中的点映射到绘图区。glFrustrum(-
,,,,,); //视景体上、下、左、右、前、后的坐标分别为,,-
,,,;glViewport(0,0,200,300); //视口区上、下、左、右坐标分别为
0,0,200,300; 视类中 OnDraw()成员函数的设置 在 Windows 的 VC++编程中,所
有窗口中的图形绘制代码都在视类的 OnDraw 成员函数中实现,采用 OpenGL 绘制三维曲
面之前需要进行必要的环境设置。 glClearColor(,,,);//设置背景颜色为
白色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓
存 glColor3f(,,);//设置绘图颜色为红色 创建绘制三维曲面的显示列表
在显示列表中定义用户绘制三维曲面图形所需数据以及数据之间显示连接方式。文中实
例中显示列表包括三维曲面图形的数据点的显示列表;坐标轴的显示列表;显示坐标数据
的显示列表。显示列表采用线段连接的方式。