郑 悦,何 婕,黄子硕,韩志军
(1.北京青云航空仪表有限公司,北京 101300;2.空军驻北京地区第五军代表室,北京 101300)
当今电子机载设备在整个飞行过程中担负着飞行控制、导航、通信等多种任务,尤其是机载显示器[1],是新一代航空电子系统实现综合化、数字化和智能化的核心与关键[2],也是人机交互的桥梁,把多种飞行参数转换为视觉信息,显示在显示器上,飞行员读取这些信息,做出正确的判断和决策。 随着现代飞行技术的发展与飞机性能的日益提高,飞行员需要的信息越来越多,对机载设备的显示质量提出了越来越高的要求。
为了更直观地给飞行员提供显示信息,要求尽可能用图形显示来代替传统的座舱机械仪表[3]。 图形显示方式的采用,使得一些复杂的飞行状况变得一目了然,显示方式变得直观、方便、灵活。 至此,舱内图形显示开始占据越来越重要的位置。 20 世纪70 年代中期,电子化、数字化的综合显示仪表平视仪的研制,让所有需要显示的数据或消息出现在飞行员平视方向的前方,被认为是近代战斗机不可缺少的航空电子装备之一。 随着技术的发展,机载电子综合显示器对机载图形显示软件的开发提出了更高的要求,一方面要求图形生成速度满足界面更新的要求;另一方面要求提高画面质量,满足飞行员的视觉要求。 本文首先对机载图形软件的功能和开发难点进行了介绍;其次给出了机载图形软件的开发流程和方法;为提升图形显示质量,对几种图形画面反走样技术进行了分析,并提出了基于纹理贴图的抗锯齿方法,对比分析结果验证了本文所提方法的有效性;最后,对基于OpenGL ES 的机载图形软件开发进行了总结和展望。
目前,机载综合显示器可实现飞机姿态和状态信息的动态实时显示,其典型画面为姿态指示(Attitude Indication,AI) 和水平状态指示(Horizontal State Indication,HSI)[4]。 AI 和HSI 画面包括复杂的天地球图形和罗盘画面等,并且要求画面实时反映飞机的姿态和航向信息。 典型机载显示器产品主画面如图1所示。
图1 机载显示器画面实例
从图1 可以看出,典型的机载显示器系统为姿态指示画面(AI)和水平态势指示画面(HSI)的组合,包括俯仰角、横滚角、空速、高度、垂直速度、全罗盘、无线电方位指示、数字显示、中英文字体等。 由此可见,显示系统的几何图形大多是由点、线、多边形等组合拼接而成,因此,机载图形显示软件的基本功能是实现对点、线、多边形、字符这些几何图形的处理。
机载图形显示软件用于产生飞机的各种飞行参数画面,接收并处理接收到的指令和绘图数据,实时完成绘图工作,产生相应的字符和图形,并形成视频信号送至液晶显示器。 在设计和实现机载图形显示软件时,需综合考虑以下问题。
(1)实时性问题。 图形处理器每生成一幅画面均需要计算和扫描整幅屏幕,在单位时间内要处理和显示的像素很多,而机载显示器是对实时性要求很高的系统。 飞机的飞行状态变化快,座舱内图形显示出现可觉察的延迟或读数误差,都有可能酿成重大飞行事故,所以图形软件要保持画面显示的连续性,数据显示的实时性,才能保证飞行的安全性。
(2)显示效果问题。 基于液晶显示器的图形显示画面中都有各种各样的走样问题,如:直线、多边形旋转的锯齿,字符显示模糊。 如何优化图形显示效果,在缩短处理时间的同时,提升图形显示效果,是机载图形显示研究的重要问题。
机载图形显示技术经过了几十年的发展,至今已形成了若干典型的图形处理软件、技术和开发平台。目前,图形显示开发软件大部分是基于OpenGL 库,其优点在于用户不必从底层开始开发,只需将工作集中于设计和实现图形软件功能。 OpenGL 库虽然功能全面,但过于庞大,函数很多但使用有限。 因此,现在针对嵌入式图形的开发大多使用OpenGL ES 库。
对于机载图形软件的开发,传统方法是手工编码开发图形软件,利用汇编或C 等语言开发绘图函数,或直接调用OpenGL 等图形API 开发,该方法对开发各方面的可控性良好,对源代码具有完全访问权,便于归档及测试。 缺点是开发时图形效果不可见,只有下载至硬件环境中才能看到,需要较多的人力资源,而且开发过程很容易出错。
现代方法更多使用高级图形建模软件,具有功能强大的用户交互单元即图形用户接口(GUI),开发者可在上位机通过点、线等基础图元直观地建模,可直接看到开发结果,并且图形可动态显示,无需编写代码,绘制完成后可根据需要生成OpenGLOpenGL ES 代码,开发简易快捷。 这样的建模软件以VAPS 及其套件CCG(C Code Generator)和IDATA 为代表,本文在机载图形软件开发过程中使用的是IDATA 软件。 IDATA开发界面如图2 所示。
图2 IDATA 开发界面
典型的IDATA 工程文件包括3 个部分:
(1)Make 文件。 主要用于工程的编译,包括各库文件、文件的声明和编译路径。
(2)C/Cpp 文件。 逻辑控制文件,包括变量声明和显示任务调用函数。 IDATA 必须在安装有VC 编译器的系统下才能正常运行。
(3)Xml 文件。 图形定义文件,包括所有界面元素的名称、位置、颜色、相关变量等信息。
IDATA 工具由以下4 部分组成:
(1)Font Creator。 用来定制仪表中的文字、符号等。
(2)IDATAModeler。 核心开发工具,对界面的图形和内部逻辑关系进行开发,全部基于图形化开发。
(3)TestDataGenerator。 定义和修改测试数据。
(4)IDATALayout Edit。 将 Modeler 生成的模块进行排版和组合,并生成输出文件。
IDATA 能够将图形显示绘图代码和处理逻辑控制代码分离,使两者之间的联系转而由资深定义的基于时间驱动的通信协议所取代。 因此,使用IDATA 工具开发的软件后期的显示更改和逻辑更改相互独立、互不影响。 成功地划分了飞机制造商的设计任务,有利于座舱显示系统硬件更新换代、软件移植升级以及人机交互接口标准化。
IDATA 座舱显示系统具有更好的开放性、跨平台性和可重用性,其特性使得它非常适用于嵌入式系统、设备显示和仿真应用的开发。 无需进行费时的代码生成和编译连接,减少了应用到仿真和其他数据显示及可视化应用中的图形开发和集成时间。
IDATA 软件具有的优势包括:(1)开发流程短,具有良好的图形界面,操作简单,易于掌握。 (2)支持OpenGLES 标准,包括:纹理映射、深度、模板遮盖、裁剪、平滑渲染、反走样、alpha 混合、视频纹理以及3D 显示。 (3)跨平台特性,以及支持OpenGL ES库,非常适合用来进行嵌入式、设备显示和仿真应用的开发。 (4)生成的程序是一种经优化的OpenGL 实现,最大限度地提高了图形软件的效率。
具体开发流程为:用IDATA 开发显示器的所有画面,设置画面中各图元运动方式或显示逻辑,绘制完毕后生成OpenGL ES 代码模型,基于此模型在WindRiver WorkBench 开发环境下继续开发,将发送来的各种数据与模型关联,并编写数据发送、按键控制、液晶屏状态控制等逻辑代码,软件开发完毕后,编译生成目标码,并下载至显示器产品,软件在Vxworks 系统中运行。 具体流程如图3 所示。
图3 图形软件开发流程
图3 可以看出,用IDATA 生成的OpenGL ES 画面模型是图形软件的基础,为了提高画面显示质量和生成速度,需要对OpenGL ES 有一定了解。
OpenGL ES 是简化了的OpenGL,OpenGL ES 是一种面向嵌入式系统(包括手持式设备、飞机仪器、车辆等)的全功能2D 与3D 图形的跨平台图形应用编程接口库。 OpenGL ES 具体包括几何处理、光栅化、纹理映射、片元处理以及帧缓冲技术等。
根据 OpenGL ES 核心库的定义,绘制流程先对几何顶点数据(包括模型的顶点集、线集、多边形集)进行处理,包括逐个顶点操作和图元组合、运算器等,即对顶点进行变换,通过世界坐标变换定义显示内容,再通过视口变换定义显示位置,对图元进行剪裁以适合视区大小,在此基础上再对几何图元进行处理。
在之后的光栅化过程中,通过点、直线、多边形的二维描述,产生一系列的图元,将所有图元进行逐个片元操作处理,再将处理结果作为像素存储在帧缓存中,送至显示器进行显示。
在开发嵌入式图形显示软件中,如何在保证画面实时性的前提下,提高画面生成质量,一直都是机载图形软件开发的难点。
除了图形画面生成速度,画面质量也是图形开发人员关注的重点。 一般在画面中非水平且非垂直的直线和多边形,或多或少都会呈现锯齿状边界,这是因为直线、多边形边界在数学中描述是连续的,但在光栅显示设备上表现直线、多边形等,必须在离散位置采样。由于采样的不充分,造成信息失真叫做走样,也就是锯齿感。 用于减少或消除这种效果的技术,被称为反走样技术也可称为抗锯齿技术[5-6]。 锯齿边缘效果如图4 所示。
图4 锯齿边缘效果
一般使用OpenGL ES 库的开发人员,都会使用函数来减小点、线、多边形的锯齿效果。 OpenGL ES 库中,可以使用全屏抗锯齿的函数来实现平滑线和多边形的边缘。 其过程简单描述为把图像映射到缓存并放大,可以选择放大倍数,比如2 或4,倍数越大抗锯齿的效果越好;再对放大后的图像像素进行采样,一般选取2 个或4 个邻近像素,把这些采样混合起来后,生成最终像素,令每个像素拥有邻近像素的特征,像素与像素之间的过渡色彩,令图形的边缘色彩过渡趋于平滑;再把最终像素还原回原来大小的图像,并保存到帧缓存也就是显存中,替代原图像存储起来,最后输出到显示器,显示出一帧画面。 这样就等于把一幅模糊的大图,通过细腻化后再缩小成清晰的小图,放大像素还原过程如图5 所示。
图5 放大像素还原过程
开启OpenGL ES 库全屏抗锯齿,可以对每帧画面中的线和多边形边缘进行上述的抗锯齿处理,使渲染效果显得更为逼真和自然。 这种方法优势是简单直接,但缺点是比较消耗资源。 比如在实际产品中,一幅480×480 像素的画面生成时间为20 ms,开启了4 倍抗锯齿效果后,由于图形在绘制时被扩大了4 倍来做抗拒锯齿处理,其生成时间也延长了4 倍左右,这样会延长画面生成时间,影响画面实时性。
使用函数全屏抗锯齿的方法,操作简单,可以对全屏幕的画面做到优化锯齿的效果,但对硬件资源要求高,消耗很大。 可以用在CPU 速度快,屏幕大,但分辨率不高的条件下,进而提升全屏优化效果。
除了使用现有函数达到优化锯齿的目的,更直接的是使用反走样算法[7-11]。 介绍一个常用算法思想,对于一个采样点,一般单像素采样直线得到的颜色值只有 0 和1 两种,这时可以增加色深等级,即赋予采样点不同的灰度等级,通过采样点灰度值的不同,能让直线的边缘平滑化到理想的程度。
按照通常的采样方式,线段通过的像素会被完全涂纯色,有了灰度级别后,可以使相关联的上下像素以不同灰度表示采样结果。 灰度值取决于像素点与中心线的相对位置关系,距离中心线越近,灰度值越高,相反,距离越远灰度值越低,其实现方法如图6 所示。
图6 灰度颜色填充示意
这样的做法让线条或矩形有一种边缘颜色渐变效果,从而达到降低锯齿感效果。 采用反走样算法生成的有宽度的直线效果如图7 所示。 该反走样算法可以在直线的边缘和端点处达到平滑锯齿效果。 但算法抗锯齿需要有一定数学基础的开发人员使用,还需要长期研究和对各种情况的归纳总结,才能达到良好的效果,这对开发者要求很高。
图7 算法反走样效果
在做实际嵌入式图形项目中,使用OpenGL ES 函数抗锯齿软件实时性差,而应用软件获取图元端点坐标和颜色往往受到限制,导致使用算法抗锯齿比较困难。 因此,本文提出了一种基于渐变纹理贴图抗锯齿的方式,在保证画面实时性的前提下,可实现优化锯齿的效果。
通常情况下,在绘图时各种形状的图元填充使用的都是纯色,而纹理是由一幅图像构成,此图像内容可以为多种颜色的混合。 画面生成时,可以将此图像填充到需要的填充图元中,此过程称作纹理贴图。 简单来说,是开发者给画面中图元绘制各种衣服,这样可以将各种颜色混合的图片或各种仿真照片贴入画面的相应位置,达到各种显示效果。 纹理贴图的方式在游戏中大量使用,从而让游戏场景更加逼真。
实际项目中,画面中有很多矩形需要做移动或旋转动作,例如当纯白色矩形旋转到一定角度时,边缘锯齿感会很严重,如图8 所示。 纹理贴图优化锯齿的方法,基本思路在于绘制填充纹理时,将纹理绘制为渐变色,纹理边缘色应接近背景色,如图9 所示的填充纹理,其用于背景为黑色、需要填充为白色的矩形图元,比如俯仰、横滚、罗盘刻度线等。
图8 纯白色填充矩形旋转角度后效果
图9 渐变色的填充纹理
用渐变色的纹理贴图,填充到之前的纯白色矩形,旋转一定角度后,由于填充颜色为渐变色,并且外圈边缘色为接近背景的颜色,这样可以消隐锯齿,其效果如图10 所示,可以看出有明显的优化锯齿效果。
图10 使用渐变色纹理矩形旋转角度后效果
在实际产品中,罗盘刻度使用了纯白色填充矩形,而未使用渐变纹理贴图,其罗盘绘制效果如图11 所示,可以看出有角度的矩形刻度有明显的锯齿痕迹。
图11 纯白色刻度的罗盘效果
将此方法应用在实际显示器产品中,显示效果明显改善,如图12 所示为使用了渐变色纹理贴图后,另一个项目的罗盘显示效果,可以看到有角度的矩形刻度边缘很平滑,大部分锯齿感被消除,优化效果等同于使用算法抗锯齿的效果。
图12 使用了渐变色纹理刻度的罗盘效果
采用纹理贴图抗锯齿方法,不仅可以避免使用OpenGL 函数全屏抗锯齿而产生的时间消耗,并且可以仅对需要图元进行抗锯齿优化,相对于算法抗锯齿来说,纹理贴图更加简单直观,不用开发人员研究复杂的算法,直接绘制带有抗锯齿效果的贴图,不仅缩短了开发的时间,还减小了开发的难度。 与OpenGL ES 全屏抗锯齿方法相比,基于纹理贴图的抗锯齿方法的画面质量与开启全屏4 倍抗锯齿的效果相当,但其画面生成速度与不开启全屏抗锯齿方法接近。 因此,基于纹理贴图的抗锯齿方法可以在保证图形生成速度的基础上,实现更好的抗锯齿效果。
本文提出了一种基于渐变纹理贴图抗锯齿的方法,在机载图形软件开发中具有一定的应用价值,经多型机载类产品试验验证,本文所提方法不仅可以保障画面显示的实时性,而且具有较好的画面质量。 但还有许多有待研究之处,具体如下:(1)对于其他OpenGL ES 片元操作方式还有待研究,可以尝试其他的操作方法或者算法,在不影响画面生成速度的情况下,实现其他形状的不规则的区域显示。 (2)贴图抗锯齿的方法虽然效果很好,但应用略显局限,只能应用于线条和矩形图元,对于其他多边形和不规则图形,还需研究相应算法来进行反走样。