方 旭
(船舶重工集團(tuán)公司723所,揚(yáng)州225001)
傳統(tǒng)的電子戰(zhàn)綜合顯控系統(tǒng)經(jīng)過了許多年的發(fā)展和完善,技術(shù)相對(duì)成熟,應(yīng)用比較廣泛。隨著電子戰(zhàn)發(fā)展的需要,既往技術(shù)也顯示出許多局限性,存在一些難以解決的問題。
(1)目標(biāo)顯示能力差
通常在一個(gè)態(tài)勢(shì)圖上只能提供兩維的信息,一個(gè)目標(biāo)有許多必須的、有很強(qiáng)相關(guān)性的參數(shù),由于受到顯示技術(shù)的限制,難以集成到一個(gè)面板中去,往往需要提供多個(gè)面板,讓用戶在各個(gè)面板之間進(jìn)行頻繁的切換,甚至在幾個(gè)機(jī)柜之間通過操作員直接交流的方式來實(shí)現(xiàn)相互溝通,才能完整描述出當(dāng)前的戰(zhàn)場(chǎng)環(huán)境,傳統(tǒng)方式很難讓用戶滿意。需要提供一種實(shí)時(shí)性與表現(xiàn)力更強(qiáng)的顯控系統(tǒng),幫助指揮員更好地了解戰(zhàn)場(chǎng)周圍狀況,從而提供更好的戰(zhàn)術(shù)決策支持。
(2)負(fù)載不均衡
現(xiàn)在計(jì)算機(jī)通常都配備了多核CPU和強(qiáng)大的顯卡。CPU體系結(jié)構(gòu)仍然以32位為主,64位的還少,而主流的顯卡位寬都達(dá)到了256位。完全基于CPU運(yùn)算所實(shí)現(xiàn)的顯控系統(tǒng),由于傳統(tǒng)編程方式的限制,所有的圖形處理都是由單個(gè)CPU獨(dú)自完成的,常常是CPU忙于復(fù)雜的圖形繪制操作,CPU占用率不斷地提高,而256位寬的顯卡卻很空閑,明顯負(fù)載不均衡。
(3)難以跨平臺(tái)移植
傳統(tǒng)的綜合顯控系統(tǒng)是針對(duì)具體的硬件、操作系統(tǒng)平臺(tái)進(jìn)行開發(fā)的。但是由于各個(gè)平臺(tái)之間存在很大的差異性,難以實(shí)現(xiàn)跨平臺(tái)移植。特別是Window s不開放源代碼,用它來開發(fā)軍品項(xiàng)目存在難以預(yù)測(cè)的安全問題。如何便于跨平臺(tái)移植,將基于Windows的軟件移植到其它更加安全的系統(tǒng)上,也是開發(fā)過程中需要考慮的重要問題。
為了解決上述問題,作者認(rèn)為可以應(yīng)用Open-GL技術(shù)實(shí)現(xiàn)電子戰(zhàn)綜合顯控系統(tǒng)。
OpenGL是一個(gè)跨編程語言、跨平臺(tái)的圖形硬件編程接口規(guī)范,是行業(yè)領(lǐng)域中最為廣泛接納的2D/3D圖形應(yīng)用編程接口(API)。在最新發(fā)布的OpenGL 2.1版本中包含了700多個(gè)獨(dú)立的圖形操作函數(shù)(核心庫中約有650個(gè),輔助函數(shù)約50個(gè)),開發(fā)者可以利用這些函數(shù)來構(gòu)造景物模型,進(jìn)行交互式三維圖形應(yīng)用軟件的開發(fā)。
一個(gè)與OpenGL相關(guān)的系統(tǒng)結(jié)構(gòu)為:最底層是圖形硬件,第2層為操作系統(tǒng),第3層為窗口系統(tǒng),第4層為OpenGL,第5層為應(yīng)用程序。
OpenGL專注于圖形處理的各個(gè)方面,在設(shè)計(jì)時(shí)充分考慮到了平臺(tái)的獨(dú)立性,在實(shí)現(xiàn)時(shí)不依賴于任何窗口系統(tǒng)或操作系統(tǒng)。OpenGL在很多硬件平臺(tái)上都提供了具體的實(shí)現(xiàn),移植時(shí)只需要變更底層的窗口操作,而不需要進(jìn)行太多的變動(dòng)。這種設(shè)計(jì)理念可以幫助我們?cè)诓煌钠脚_(tái)(如Windows、Unix、Linux 、Mac OS 、OS/2)之間進(jìn)行移植。
在OpenGL中,只能使用5種基本的幾何圖元(點(diǎn)、線、三角形、四邊形、多邊形)。雖然沒有提供用于描述復(fù)雜三維物體(如汽車、人體、飛機(jī))的高級(jí)函數(shù),但是可以用基本的圖元來構(gòu)造出任意復(fù)雜的物體,靈活性強(qiáng),便于軟件開發(fā)人員控制。
已經(jīng)有一些商業(yè)公司以及開源組織以O(shè)penGL為基礎(chǔ)構(gòu)筑了Open Inventor、Cosmo3D、Optimizer等多種高級(jí)圖形庫,提供了眾多預(yù)定義的對(duì)象,開發(fā)人員也可以直接利用它們來快速構(gòu)造自己的系統(tǒng)模型。
當(dāng)繪圖命令傳遞給OpenGL后,OpenGL需要進(jìn)行一系列的運(yùn)算操作才能最終在屏幕上顯示出來。這一系列的過程稱為OpenGL渲染流水線。
圖中頂點(diǎn)數(shù)據(jù)和象素?cái)?shù)據(jù)為兩種OpenGL支持的原始數(shù)據(jù)。頂點(diǎn)數(shù)據(jù)包括模型的頂點(diǎn)集、線集、多邊形集,用來描述幾何模型。這些數(shù)據(jù)經(jīng)過運(yùn)算器、逐個(gè)頂點(diǎn)操作、圖元裝配等。Pixel data則包括像素集、影像集、位圖集等。
兩種不同類型的數(shù)據(jù)經(jīng)過流水線進(jìn)行各自的處理后,最后都經(jīng)過紋理裝配、光柵化、逐個(gè)片元操作直至把光柵數(shù)據(jù)寫入幀緩沖器。
流水線上關(guān)鍵的處理階段如下:
(1)顯示列表
顯示列表中暫存了想要執(zhí)行的繪圖命令序列。
(2)運(yùn)算器
提供了一種根據(jù)頂點(diǎn)(控制點(diǎn))導(dǎo)出描述曲面的方法。這種方法是一種多項(xiàng)式映射,能夠根據(jù)頂點(diǎn)生成法向量、紋理坐標(biāo)和空間坐標(biāo)值。
(3)逐個(gè)頂點(diǎn)操作
將頂點(diǎn)轉(zhuǎn)換為圖元,需要使用4×4的浮點(diǎn)數(shù)矩陣進(jìn)行變換,將三維空間坐標(biāo)投影到屏幕上。
(4)圖元裝配
對(duì)幾何體中位于半空間之外的部分進(jìn)行裁剪,對(duì)幾何物體做投影除法,使得遠(yuǎn)處的物體看起來比近處的物體小。
(5)像素操作
像素操作首先將系統(tǒng)內(nèi)存的像素?cái)?shù)組進(jìn)行拆封,從某種格式轉(zhuǎn)換為合適數(shù)目的分量;接下來對(duì)數(shù)據(jù)進(jìn)行縮放、偏移和像素映射;然后將得到的數(shù)據(jù)進(jìn)行截取,并將其寫入紋理內(nèi)存或發(fā)送給光柵化操作進(jìn)行處理。
(6)紋理裝配
可以將紋理圖案粘貼到幾何物體上,提供物體的真實(shí)感。
(7)光柵化
將幾何數(shù)據(jù)和像素?cái)?shù)據(jù)轉(zhuǎn)換為片元。每個(gè)片元都對(duì)應(yīng)于幀緩存中的一個(gè)像素。這個(gè)階段確定了每個(gè)片元的顏色和深度值。
(8)逐個(gè)片元操作
這個(gè)階段首先進(jìn)行紋理映射、霧計(jì)算、裁剪測(cè)試、模板測(cè)試和深度測(cè)試,然后執(zhí)行混合、拌動(dòng)、邏輯運(yùn)算和屏蔽,最后處理完成的片元被送到幀緩沖器中顯示。
在Window s平臺(tái)上,微軟提出了自己的三維圖形開發(fā)庫Direct3D,并且伴隨著Windows操作系統(tǒng)的不斷普及,應(yīng)用范圍也相當(dāng)廣泛,為三維圖形開發(fā)提供了新的手段。OpenGL成為目前三維圖形開發(fā)事實(shí)上的工業(yè)標(biāo)準(zhǔn),被許多顯卡硬件所支持。兩者在競(jìng)爭(zhēng)中不斷地完善與發(fā)展。
OpenGL和Direct3D都以經(jīng)典的流水線方式來處理圖像渲染工作,流水線中核心模塊都通過硬件直接支持,提升了渲染性能。
Direct3D是基于微軟的組件對(duì)象模型(COM)的三維圖形API。開發(fā)人員基于COM的客戶端、服務(wù)端對(duì)象進(jìn)行面向組件的編程,簡(jiǎn)化了整個(gè)程序的設(shè)計(jì)??墒?COM技術(shù)本身就是一項(xiàng)非常復(fù)雜的技術(shù),學(xué)習(xí)COM開發(fā)的周期相當(dāng)長(zhǎng),對(duì)于新加入的開發(fā)人員難以很快地上手。由于Direct3D是微軟的商業(yè)產(chǎn)品,無法查看實(shí)現(xiàn)的源代碼,許多底層的實(shí)現(xiàn)細(xì)節(jié)問題開發(fā)人員很難接觸到,系統(tǒng)查錯(cuò)和性能調(diào)優(yōu)困難。OpenGL是一個(gè)過程式的三維圖形API,主要基于傳統(tǒng)的C語言進(jìn)行過程式開發(fā),在程序中使用頭文件包含和動(dòng)態(tài)鏈接庫等傳統(tǒng)技術(shù)。執(zhí)行流程非常清晰,靈活性強(qiáng),系統(tǒng)查錯(cuò)和性能調(diào)優(yōu)容易。
Direct3D必須由系統(tǒng)硬件支持,不支持純軟件的仿真。而OpenGL可以支持軟件仿真,不是簡(jiǎn)單地報(bào)錯(cuò)或是退出。雖然微軟為了推廣Direct3D系統(tǒng),已經(jīng)宣布不再支持新版本的OpenGL??墒鞘褂瞄_源項(xiàng)目mase3D可以在不支持最新OpenGL版本的Windows機(jī)器上,利用底層的GDI庫來模擬仿真出OpenGL的全部功能,方便進(jìn)行移植工作。
Direct3D僅能用于Windows系列平臺(tái)。OpenGL可以支持多種操作系統(tǒng)平臺(tái)。支持多種操作系統(tǒng)平臺(tái),這對(duì)于開發(fā)軍品項(xiàng)目是非常必要的。
Direct3D包含圖形、聲音、輸入、網(wǎng)絡(luò)等各種多媒體模塊。OpenGL只是圖形函數(shù)庫。
微軟對(duì) Direct3D的更新非常頻繁。OpenGL規(guī)范較Direct3D更加嚴(yán)謹(jǐn),版本更新少,版本更新中新增技術(shù)少。OpenGL 3.1是2009年3月Khronos Group公布的最新版本,業(yè)界圖形廠商很快予以了大力支持。AMD、NVIDIA、S3 Graphics的顯卡驅(qū)動(dòng)目前都已經(jīng)支持OpenGL 3.0。
由于微軟不再更新OpenGL的實(shí)現(xiàn),只能遵循OpenGL 1.1標(biāo)準(zhǔn)來構(gòu)造系統(tǒng)。
OpenGL是 client/server結(jié)構(gòu),即 client(用OpenGL繪制景物的應(yīng)用程序)向 server(OpenGL內(nèi)核)發(fā)出OpenGL命令,server解釋這些命令。所以,OpenGL可以十分方便地在網(wǎng)絡(luò)環(huán)境下使用。OpenGL體系結(jié)構(gòu)見圖1。
圖1 OpenGL體系結(jié)構(gòu)
OpenGL被封裝在Windows的動(dòng)態(tài)鏈接庫OpenGL32.DLL中。客戶應(yīng)用程序調(diào)用的Open-GL命令依次在OpenGL32.DLL、WINSRV.DLL、Win32的設(shè)備驅(qū)動(dòng)接口(DDI)中處理,最后經(jīng)過處理的圖形命令被送給顯卡設(shè)備驅(qū)動(dòng)程序。
在MFC框架中,可以很容易地使用OpenGL。以下給出基本步驟:
(1)包含必要的頭文件
為了能夠支持OpenGL,在工程中必須包含GL.H、GLU.H和GLAUX.H三個(gè)頭文件。將頭文件包含放在預(yù)定義頭文件stdafx.h中,可以減少多次包含工作。MFC庫自動(dòng)將所需的導(dǎo)入庫OpenGL32.lib和GLu32.lib以及靜態(tài)鏈接庫GLaux.lib包含到鏈接選項(xiàng)中,不必手工增加這些鏈接庫。
(2)增加并創(chuàng)建渲染環(huán)境
在Windows環(huán)境下,繪圖操作是在窗口的設(shè)備環(huán)境(Device Context)上進(jìn)行操作的。在使用OpenGL時(shí),需要提供一個(gè)渲染環(huán)境,系統(tǒng)通過渲染環(huán)境將所有的OpenGL調(diào)用命令連接到設(shè)備環(huán)境上。這里聲明了渲染環(huán)境變量m_hRC,并在創(chuàng)建視圖的同時(shí)初始化了渲染環(huán)境。
在MFC的視圖窗口創(chuàng)建成功后,需要設(shè)置窗口像素格式。在結(jié)構(gòu)體pfd中設(shè)置標(biāo)志位dwFlags為PFD_DRAW_TO_WINDOW(支持窗口設(shè)備繪制),PFD_SUPPORT_OPENGL(支持 OpenGL),PFD_DOUBLEBUFFER(支持雙緩沖技術(shù)),iPixel-Type為PFD_TYPE_RGBA,給出指定的色彩深度cColorBits、深度緩存cDepthBits以及其他必要的參數(shù)設(shè)置。然后調(diào)用 ChoosePixelFormat和 Set-PixelFormat來設(shè)置窗口像素格式。接著調(diào)用wgl-CreateContext創(chuàng)建一個(gè)和設(shè)備環(huán)境相適應(yīng)的渲染環(huán)境m_hRC。最后調(diào)用wglMakeCurrent關(guān)聯(lián)設(shè)備環(huán)境和渲染環(huán)境。
(3)調(diào)整窗口大小
第一次繪制視圖或者改變視圖大小時(shí),需要重新設(shè)置渲染模型。glViewport重設(shè)當(dāng)前視口的范圍,glMatrixMode指定不同的坐標(biāo)轉(zhuǎn)換矩陣,gl-LoadIdentity重置當(dāng)前矩陣。
(4)繪圖操作
實(shí)際的繪圖操作放在OnDraw成員函數(shù)中。glClear清除屏幕內(nèi)容和深度緩存,glLoadIdentity重置當(dāng)前的模型觀察矩陣。glBegin和glEnd封裝一組相關(guān)的頂點(diǎn)序列、定義幾何圖元。
為了保證充分利用OpenGL直接操縱硬件繪圖,不應(yīng)該使用設(shè)備環(huán)境進(jìn)行繪圖。
(5)清理環(huán)境
程序退出時(shí),需要釋放系統(tǒng)資源,再次調(diào)用wglMakeCurrent分離渲染環(huán)境窗口設(shè)備環(huán)境,wglDeleteContext釋放渲染環(huán)境。凡是在繪制過程中創(chuàng)建出的系統(tǒng)資源(包括二次曲面、樣條曲線、紋理對(duì)象、顯示列表等),都需要在退出時(shí)被釋放。
這里給出GDI繪圖及OpenGL繪圖產(chǎn)生的電子戰(zhàn)綜合顯控系統(tǒng)屏幕截圖,如圖2和圖3所示??梢钥闯?圖3比圖2具有更強(qiáng)的表現(xiàn)力,顯示效果更好。
圖2 GDI繪制的綜合顯控系統(tǒng)態(tài)勢(shì)圖
圖3 OpenGL繪制的綜合顯控系統(tǒng)態(tài)勢(shì)圖
綜上所述,針對(duì)傳統(tǒng)綜合顯控系統(tǒng)中存在的問題,可用基于OpenGL的綜合顯控系統(tǒng)得到解決。
利用OpenGL技術(shù)可以在一個(gè)界面中集成盡可能多的參數(shù)信息,可以賦予一種仿真的、三維的并且具有實(shí)時(shí)交互能力的態(tài)勢(shì)顯示,可以在三維圖形世界中用以前不可想象的手段來獲取目標(biāo)的信息以及分析周圍環(huán)境的狀況。
通用計(jì)算的發(fā)展趨勢(shì)是中央處理單元(CPU)和繪圖處理單元(GPU)的整合。需要復(fù)雜條件控制的、只能串行處理的任務(wù)適合于CPU承擔(dān)。GPU定位為CPU的協(xié)處理器,大量數(shù)據(jù)并行計(jì)算的任務(wù)適合于GPU承擔(dān)。
圖形渲染適合于并行處理,CPU實(shí)際上難以勝任圖形渲染任務(wù)。GPU編程以流式編程模型為基礎(chǔ),這種并行處理允許高效計(jì)算和通信。
OpenGL系統(tǒng)能夠?qū)⒗L圖命令直接轉(zhuǎn)換為底層顯卡的硬件指令,在整個(gè)繪圖過程中無需CPU的加入,充分利用了顯卡的性能,實(shí)現(xiàn)了負(fù)載均衡。
在基于OpenGL的綜合顯控系統(tǒng)實(shí)現(xiàn)過程中,不需要編寫直接訪問底層操作系統(tǒng)的繪圖代碼,只需要利用OpenGL提供的標(biāo)準(zhǔn)API函數(shù),便可以實(shí)現(xiàn)與設(shè)備無關(guān)的操作,提高了編程效率。如果需要跨平臺(tái)移植,只需要更改與平臺(tái)相關(guān)部分的代碼——窗口管理。對(duì)核心的繪圖操作,只要底層的顯卡能夠支持OpenGL,則無需修改。解決了平臺(tái)間移植的難題,同時(shí)也解決了Windows操作系統(tǒng)的不安全問題。
[1]Dave Shreiner,Mason Woo,Jackie Neider,Tom Davis.OpenGL Programming Guide Sixth Edition[M].Massachusetts:Addison-Wesley,2007.
[2]丁藝明,劉波.利用GPU進(jìn)行高性能數(shù)據(jù)并行計(jì)算[J].程序員,2008(4):97-99.