APP下载

基于OpenGL的电子战综合显控系统设计

2010-06-28

舰船电子对抗 2010年4期
关键词:跨平台控系统绘图

方 旭

(船舶重工集团公司723所,扬州225001)

1 传统电子战综合显控系统中存在的问题

传统的电子战综合显控系统经过了许多年的发展和完善,技术相对成熟,应用比较广泛。随着电子战发展的需要,既往技术也显示出许多局限性,存在一些难以解决的问题。

(1)目标显示能力差

通常在一个态势图上只能提供两维的信息,一个目标有许多必须的、有很强相关性的参数,由于受到显示技术的限制,难以集成到一个面板中去,往往需要提供多个面板,让用户在各个面板之间进行频繁的切换,甚至在几个机柜之间通过操作员直接交流的方式来实现相互沟通,才能完整描述出当前的战场环境,传统方式很难让用户满意。需要提供一种实时性与表现力更强的显控系统,帮助指挥员更好地了解战场周围状况,从而提供更好的战术决策支持。

(2)负载不均衡

现在计算机通常都配备了多核CPU和强大的显卡。CPU体系结构仍然以32位为主,64位的还少,而主流的显卡位宽都达到了256位。完全基于CPU运算所实现的显控系统,由于传统编程方式的限制,所有的图形处理都是由单个CPU独自完成的,常常是CPU忙于复杂的图形绘制操作,CPU占用率不断地提高,而256位宽的显卡却很空闲,明显负载不均衡。

(3)难以跨平台移植

传统的综合显控系统是针对具体的硬件、操作系统平台进行开发的。但是由于各个平台之间存在很大的差异性,难以实现跨平台移植。特别是Window s不开放源代码,用它来开发军品项目存在难以预测的安全问题。如何便于跨平台移植,将基于Windows的软件移植到其它更加安全的系统上,也是开发过程中需要考虑的重要问题。

2 基于OpenGL的综合显控系统解决方案

为了解决上述问题,作者认为可以应用Open-GL技术实现电子战综合显控系统。

2.1 关于OpenGL

OpenGL是一个跨编程语言、跨平台的图形硬件编程接口规范,是行业领域中最为广泛接纳的2D/3D图形应用编程接口(API)。在最新发布的OpenGL 2.1版本中包含了700多个独立的图形操作函数(核心库中约有650个,辅助函数约50个),开发者可以利用这些函数来构造景物模型,进行交互式三维图形应用软件的开发。

一个与OpenGL相关的系统结构为:最底层是图形硬件,第2层为操作系统,第3层为窗口系统,第4层为OpenGL,第5层为应用程序。

OpenGL专注于图形处理的各个方面,在设计时充分考虑到了平台的独立性,在实现时不依赖于任何窗口系统或操作系统。OpenGL在很多硬件平台上都提供了具体的实现,移植时只需要变更底层的窗口操作,而不需要进行太多的变动。这种设计理念可以帮助我们在不同的平台(如Windows、Unix、Linux 、Mac OS 、OS/2)之间进行移植。

在OpenGL中,只能使用5种基本的几何图元(点、线、三角形、四边形、多边形)。虽然没有提供用于描述复杂三维物体(如汽车、人体、飞机)的高级函数,但是可以用基本的图元来构造出任意复杂的物体,灵活性强,便于软件开发人员控制。

已经有一些商业公司以及开源组织以OpenGL为基础构筑了Open Inventor、Cosmo3D、Optimizer等多种高级图形库,提供了众多预定义的对象,开发人员也可以直接利用它们来快速构造自己的系统模型。

2.2 OpenGL工作流程

当绘图命令传递给OpenGL后,OpenGL需要进行一系列的运算操作才能最终在屏幕上显示出来。这一系列的过程称为OpenGL渲染流水线。

图中顶点数据和象素数据为两种OpenGL支持的原始数据。顶点数据包括模型的顶点集、线集、多边形集,用来描述几何模型。这些数据经过运算器、逐个顶点操作、图元装配等。Pixel data则包括像素集、影像集、位图集等。

两种不同类型的数据经过流水线进行各自的处理后,最后都经过纹理装配、光栅化、逐个片元操作直至把光栅数据写入帧缓冲器。

流水线上关键的处理阶段如下:

(1)显示列表

显示列表中暂存了想要执行的绘图命令序列。

(2)运算器

提供了一种根据顶点(控制点)导出描述曲面的方法。这种方法是一种多项式映射,能够根据顶点生成法向量、纹理坐标和空间坐标值。

(3)逐个顶点操作

将顶点转换为图元,需要使用4×4的浮点数矩阵进行变换,将三维空间坐标投影到屏幕上。

(4)图元装配

对几何体中位于半空间之外的部分进行裁剪,对几何物体做投影除法,使得远处的物体看起来比近处的物体小。

(5)像素操作

像素操作首先将系统内存的像素数组进行拆封,从某种格式转换为合适数目的分量;接下来对数据进行缩放、偏移和像素映射;然后将得到的数据进行截取,并将其写入纹理内存或发送给光栅化操作进行处理。

(6)纹理装配

可以将纹理图案粘贴到几何物体上,提供物体的真实感。

(7)光栅化

将几何数据和像素数据转换为片元。每个片元都对应于帧缓存中的一个像素。这个阶段确定了每个片元的颜色和深度值。

(8)逐个片元操作

这个阶段首先进行纹理映射、雾计算、裁剪测试、模板测试和深度测试,然后执行混合、拌动、逻辑运算和屏蔽,最后处理完成的片元被送到帧缓冲器中显示。

2.3 OpenGL与Direct 3D的比较

在Window s平台上,微软提出了自己的三维图形开发库Direct3D,并且伴随着Windows操作系统的不断普及,应用范围也相当广泛,为三维图形开发提供了新的手段。OpenGL成为目前三维图形开发事实上的工业标准,被许多显卡硬件所支持。两者在竞争中不断地完善与发展。

OpenGL和Direct3D都以经典的流水线方式来处理图像渲染工作,流水线中核心模块都通过硬件直接支持,提升了渲染性能。

Direct3D是基于微软的组件对象模型(COM)的三维图形API。开发人员基于COM的客户端、服务端对象进行面向组件的编程,简化了整个程序的设计。可是,COM技术本身就是一项非常复杂的技术,学习COM开发的周期相当长,对于新加入的开发人员难以很快地上手。由于Direct3D是微软的商业产品,无法查看实现的源代码,许多底层的实现细节问题开发人员很难接触到,系统查错和性能调优困难。OpenGL是一个过程式的三维图形API,主要基于传统的C语言进行过程式开发,在程序中使用头文件包含和动态链接库等传统技术。执行流程非常清晰,灵活性强,系统查错和性能调优容易。

Direct3D必须由系统硬件支持,不支持纯软件的仿真。而OpenGL可以支持软件仿真,不是简单地报错或是退出。虽然微软为了推广Direct3D系统,已经宣布不再支持新版本的OpenGL。可是使用开源项目mase3D可以在不支持最新OpenGL版本的Windows机器上,利用底层的GDI库来模拟仿真出OpenGL的全部功能,方便进行移植工作。

Direct3D仅能用于Windows系列平台。OpenGL可以支持多种操作系统平台。支持多种操作系统平台,这对于开发军品项目是非常必要的。

Direct3D包含图形、声音、输入、网络等各种多媒体模块。OpenGL只是图形函数库。

微软对 Direct3D的更新非常频繁。OpenGL规范较Direct3D更加严谨,版本更新少,版本更新中新增技术少。OpenGL 3.1是2009年3月Khronos Group公布的最新版本,业界图形厂商很快予以了大力支持。AMD、NVIDIA、S3 Graphics的显卡驱动目前都已经支持OpenGL 3.0。

3 基于OpenGL的综合显控系统的开发

由于微软不再更新OpenGL的实现,只能遵循OpenGL 1.1标准来构造系统。

3.1 Windows的OpenGL结构

OpenGL是 client/server结构,即 client(用OpenGL绘制景物的应用程序)向 server(OpenGL内核)发出OpenGL命令,server解释这些命令。所以,OpenGL可以十分方便地在网络环境下使用。OpenGL体系结构见图1。

图1 OpenGL体系结构

OpenGL被封装在Windows的动态链接库OpenGL32.DLL中。客户应用程序调用的Open-GL命令依次在OpenGL32.DLL、WINSRV.DLL、Win32的设备驱动接口(DDI)中处理,最后经过处理的图形命令被送给显卡设备驱动程序。

3.2 在微软基础类库(MFC)中使用OpenGL

在MFC框架中,可以很容易地使用OpenGL。以下给出基本步骤:

(1)包含必要的头文件

为了能够支持OpenGL,在工程中必须包含GL.H、GLU.H和GLAUX.H三个头文件。将头文件包含放在预定义头文件stdafx.h中,可以减少多次包含工作。MFC库自动将所需的导入库OpenGL32.lib和GLu32.lib以及静态链接库GLaux.lib包含到链接选项中,不必手工增加这些链接库。

(2)增加并创建渲染环境

在Windows环境下,绘图操作是在窗口的设备环境(Device Context)上进行操作的。在使用OpenGL时,需要提供一个渲染环境,系统通过渲染环境将所有的OpenGL调用命令连接到设备环境上。这里声明了渲染环境变量m_hRC,并在创建视图的同时初始化了渲染环境。

在MFC的视图窗口创建成功后,需要设置窗口像素格式。在结构体pfd中设置标志位dwFlags为PFD_DRAW_TO_WINDOW(支持窗口设备绘制),PFD_SUPPORT_OPENGL(支持 OpenGL),PFD_DOUBLEBUFFER(支持双缓冲技术),iPixel-Type为PFD_TYPE_RGBA,给出指定的色彩深度cColorBits、深度缓存cDepthBits以及其他必要的参数设置。然后调用 ChoosePixelFormat和 Set-PixelFormat来设置窗口像素格式。接着调用wgl-CreateContext创建一个和设备环境相适应的渲染环境m_hRC。最后调用wglMakeCurrent关联设备环境和渲染环境。

(3)调整窗口大小

第一次绘制视图或者改变视图大小时,需要重新设置渲染模型。glViewport重设当前视口的范围,glMatrixMode指定不同的坐标转换矩阵,gl-LoadIdentity重置当前矩阵。

(4)绘图操作

实际的绘图操作放在OnDraw成员函数中。glClear清除屏幕内容和深度缓存,glLoadIdentity重置当前的模型观察矩阵。glBegin和glEnd封装一组相关的顶点序列、定义几何图元。

为了保证充分利用OpenGL直接操纵硬件绘图,不应该使用设备环境进行绘图。

(5)清理环境

程序退出时,需要释放系统资源,再次调用wglMakeCurrent分离渲染环境窗口设备环境,wglDeleteContext释放渲染环境。凡是在绘制过程中创建出的系统资源(包括二次曲面、样条曲线、纹理对象、显示列表等),都需要在退出时被释放。

3.3 GDI绘图与OpenGL绘图结果比较

这里给出GDI绘图及OpenGL绘图产生的电子战综合显控系统屏幕截图,如图2和图3所示。可以看出,图3比图2具有更强的表现力,显示效果更好。

图2 GDI绘制的综合显控系统态势图

图3 OpenGL绘制的综合显控系统态势图

4 总结

综上所述,针对传统综合显控系统中存在的问题,可用基于OpenGL的综合显控系统得到解决。

4.1 提高了系统的表现能力

利用OpenGL技术可以在一个界面中集成尽可能多的参数信息,可以赋予一种仿真的、三维的并且具有实时交互能力的态势显示,可以在三维图形世界中用以前不可想象的手段来获取目标的信息以及分析周围环境的状况。

4.2 实现了负载均衡

通用计算的发展趋势是中央处理单元(CPU)和绘图处理单元(GPU)的整合。需要复杂条件控制的、只能串行处理的任务适合于CPU承担。GPU定位为CPU的协处理器,大量数据并行计算的任务适合于GPU承担。

图形渲染适合于并行处理,CPU实际上难以胜任图形渲染任务。GPU编程以流式编程模型为基础,这种并行处理允许高效计算和通信。

OpenGL系统能够将绘图命令直接转换为底层显卡的硬件指令,在整个绘图过程中无需CPU的加入,充分利用了显卡的性能,实现了负载均衡。

4.3 解决了跨平台移植难题

在基于OpenGL的综合显控系统实现过程中,不需要编写直接访问底层操作系统的绘图代码,只需要利用OpenGL提供的标准API函数,便可以实现与设备无关的操作,提高了编程效率。如果需要跨平台移植,只需要更改与平台相关部分的代码——窗口管理。对核心的绘图操作,只要底层的显卡能够支持OpenGL,则无需修改。解决了平台间移植的难题,同时也解决了Windows操作系统的不安全问题。

[1]Dave Shreiner,Mason Woo,Jackie Neider,Tom Davis.OpenGL Programming Guide Sixth Edition[M].Massachusetts:Addison-Wesley,2007.

[2]丁艺明,刘波.利用GPU进行高性能数据并行计算[J].程序员,2008(4):97-99.

猜你喜欢

跨平台控系统绘图
来自河流的你
“禾下乘凉图”绘图人
跨层级网络、跨架构、跨平台的数据共享交换关键技术研究与系统建设
一款游戏怎么挣到全平台的钱?
关于DALI灯控系统的问答精选
联调联试中列控系统兼容性问题探讨
数字电视播控系统关键技术探究
垂涎三尺
基于Arduino的智能家居灯控系统设计
基于C++语言的跨平台软件开发的设计