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