李華君,張 超,陳 婧,林 悅
(中國船舶集團有限公司第八研究院,南京 211153)
現(xiàn)代雷達需要顯示的信息量龐大[1],對數(shù)據(jù)處理的實時性要求較高,雷達的顯控終端的設(shè)計顯得尤為重要。[2]在非國產(chǎn)化平臺下,顯控終端對雷達回波、尾跡衰減效果的顯示實現(xiàn)主要有以下幾種方法:(1)基于專用圖形卡+軟件繪制疊加的軟硬件結(jié)合方法;(2)采用CPU+GPU的聯(lián)合渲染的方法;(3)利用CPU資源和軟件技術(shù)結(jié)合(如MFC框架下GDI或D3D繪制等)的方法。以上方法或不支持國產(chǎn)平臺,或不適配國產(chǎn)操作系統(tǒng),或造成大量的系統(tǒng)資源占用。[3]而采用硬件板卡的方式,設(shè)備成本及維護費用大。[4]針對雷達軟件化和國產(chǎn)化的迫切需求,開展基于國產(chǎn)化有限資源環(huán)境下的回波視頻軟件繪制研究勢在必行。
本文提出了一種結(jié)合QT圖形化視圖框架特性,基于圖元分層及OpenGL繪制回波視頻的雷達綜合態(tài)勢顯示軟件實現(xiàn)方法;在顯示圖層中實現(xiàn)回波視頻及其尾跡衰減效果的顯示控制,并結(jié)合其他圖層完成綜合態(tài)勢集成顯示,通過實驗驗證了方法的可行性;采用QT和OpenGL結(jié)合的方法,為開發(fā)者提供高效解決方法,并支持跨平臺移植應(yīng)用;利用OpenGL著色語言(OpenGLShadingLanguage,GLSL)編程將數(shù)據(jù)計算和圖形渲染放在GPU進行,有效平衡了系統(tǒng)開銷。
OpenGL是圖形硬件的一個軟件接口,也是該領(lǐng)域的工業(yè)標準。OpenGL是一個與硬件無關(guān)的軟件接口,可支持不同的系統(tǒng),如Windows系統(tǒng)、Unix、Linux、MacOS、OS/2及主流國產(chǎn)操作系統(tǒng)。因此,基于OpenGL的軟件移植性好,應(yīng)用廣泛。
GLSL是一種類似于C/C++的高級語言。使用GLSL語言編寫自定義的著色器有利于開發(fā)者移植和實現(xiàn)所需的特效效果。
最新的OpenGL標準中定義了3個可編程圖形處理器,即“頂點著色器”(Vertex Shader),“幾何著色器”(Geometry Shader)和“片段著色器”(Fragment Shader)。圖形管線渲染流程的每個階段抽象展示如圖1所示,其中背景部分代表的是可以注入自定義的著色器的部分。
圖1 管線渲染流程
自定義的頂點著色器會替換固定管線中所有的關(guān)于頂點的運算,包括頂點和法線變換、紋理坐標生成和變換、光照以及材質(zhì)應(yīng)用這些傳統(tǒng)的管線命令。自定義的幾何著色器會替換固定管線中所有關(guān)于圖元操作,包括剪裁、增加和改變圖元的工作。自定義的片段著色器會替換固定管線中所有關(guān)于片段的運算,包括代紋理應(yīng)用、霧化和像素匯總的工作。
紋理是一種結(jié)構(gòu)化的存儲形式。除了常見的二維紋理以外,也存在一維、三維或者多個紋理疊加后形成的單一對象。紋理是由紋素組成。除了用于儲存圖像數(shù)據(jù),它也可以被用來儲存大量的數(shù)據(jù),如地形數(shù)據(jù)、視頻數(shù)據(jù)等。這些紋理數(shù)據(jù)可以發(fā)送給著色器。著色器使用紋理采樣器來快速尋址并采樣。紋理中的數(shù)據(jù)可以被GPU直接讀取并進行渲染,可節(jié)省大量的內(nèi)存空間。
雷達綜合態(tài)勢顯示軟件結(jié)合QT圖形化視圖框架特性實現(xiàn),采用的GraphicsView框架如圖2所示。
GraphicsView是一個基于圖元的Model/View架構(gòu)的框架,能對大量圖元進行管理,并提供碰撞檢測、坐標變換和圖元組等多種方便的功能。軟件將OpenGL繪制、二次目標、坐標軸輔助線和開窗起始區(qū)域繪制等使用QGraphicsItem包裝,按照一定的層疊順序放入一個Graphics Scene進行管理。圖元的層疊順序由下而上依次是:
圖2 雷達綜合態(tài)勢顯示分層架構(gòu)
(1) OpenGL圖層:完成回波視頻的繪制,用OpenGL的FBO和頂點、片段著色器特性實現(xiàn)了雷達尾跡衰減效果,封裝為GLLayerItem圖元。
(2) 坐標系圖層:實現(xiàn)方位刻度、距標環(huán)和方位線等信息繪制功能,封裝為CoordsLayerItem圖元。
(3) 圖形繪制圖層:實現(xiàn)自定義繪圖、電子海圖、開窗區(qū)域、自動起始區(qū)域等繪制功能,封裝為GraphLayerItem圖元。
(4) 目標圖層:實現(xiàn)目標信息管理、目標軌跡管理等繪制功能,封裝為TargetLayerItem圖元。
(5) 掃描線圖層:實現(xiàn)對掃描線消隱及其尾跡衰減、消隱的繪制與控制,封裝為ScanLineLayerItem圖元。
為了在GraphicsView框架中利用OpenGL的特性進行圖形渲染,需要設(shè)置一個新的QGLWidget作為QGraphicsView的視口。如果需要OpenGL提供反鋸齒功能,則需要引入OpenGL采樣緩沖支持,其中回波視頻的繪制工作主要在GLLayerItem圖元中完成。為了在GLLayerItem圖元中進行自定義的OpenGL繪制,需要重寫圖元的虛函數(shù)GLLayerItem::paint(),并在beginNativePaint()和endNativePainting()兩個函數(shù)之間進行相關(guān)的OpenGL繪制操作。
如圖3所示,根據(jù)天線實時角度提交一組頂點數(shù)據(jù)(V1,V2,V3)繪制扇形區(qū)域。利用GLSL計算片元顏色,實現(xiàn)掃描線漸變效果。
圖3 掃描線尾跡衰減繪制示意圖
(1) 繪制圓心角為θ扇形區(qū)域。OpenGL沒有提供直接繪制圓形或扇形方法。按照極限思維的方式,可以將扇形區(qū)域分割成n個圓心角為θ/n的扇形,分割數(shù)量n越多,圓心角為θ/n度數(shù)越小,因此可以把圓形或扇形區(qū)域認為由多個等腰三角形組成。
(2) 計算根據(jù)扇形區(qū)域頂點所在角度與掃描線的角度偏差值,設(shè)置線性混合系數(shù),如圖4所示。在片段著色器中利用GLSL內(nèi)置函數(shù)atan()、degrees()等計算扇形區(qū)域頂點所在的方位角度angle。根據(jù)方位角度angle與天線方位antennaAzi的差值diff設(shè)置線性混合系數(shù)a。調(diào)用內(nèi)置函數(shù)mix(antennaColor,blackColor,a)實現(xiàn)顏色antennaColor、blackColor的線性混疊,實現(xiàn)顏色漸變。整個過程頂點方位計算在GPU端進行,每次繪制只需要從提交一組頂點數(shù)據(jù)至GPU即可。
圖4 實現(xiàn)顏色混合的片段著色器
用OpenGL的FBO、紋理和頂點和片段著色器特性實現(xiàn)了回波視屏的繪制和尾跡衰減效果。textureA用于存儲當(dāng)前需要更新扇形區(qū)域的視頻數(shù)據(jù),textureB用于存儲當(dāng)前和歷史視頻(包括尾跡衰減)的所有視頻數(shù)據(jù)。
(1) 視頻數(shù)據(jù)的解算與周期內(nèi)視頻繪制
雷達回波視頻數(shù)據(jù)存儲一個方位Azin上距離由近及遠所有點的幅度值A(chǔ)nm,點之間距離約為30 m,方位上數(shù)據(jù)格式為
v=
(1)
c=<0,Anm/Amax,0>
(2)
雷達綜合態(tài)勢顯示軟件通過定時器來觸發(fā)視頻的刷新,時間周期(刷新率)根據(jù)需求給定。如圖5所示,時間周期內(nèi)收到方位Azii至方位Azij(0<=i,j<=n)的視頻數(shù)據(jù)經(jīng)過坐標和幅度的計算轉(zhuǎn)化為OpenGL坐標系下的頂點坐標值、頂點RGB值后用頂點數(shù)組提交給GPU繪制,并渲染到textureA。
圖5 方位區(qū)間內(nèi)視頻紋理繪制
(2) 使用著色器紋理采樣
使用著色器對textureB方位Azii至方位Azij(0<=i,j<=n)區(qū)域內(nèi)顏色進行衰減。如圖6所示,利用片段著色器中的內(nèi)值函數(shù)計算textureB紋理坐標所在的方位角度angle。如果屬于要更新的區(qū)域,則用GLSL內(nèi)置函數(shù)texture2D (textureB,textBCoord)進行textureB紋理采樣,將采樣值與衰減系數(shù)相乘,實現(xiàn)顏色的衰減。如圖7所示。
圖6 實現(xiàn)顏色衰減的片段著色器
(3) 幀緩沖對象進行紋理疊加
FBO用于數(shù)據(jù)渲染到紋理對象,使用FBO技術(shù)會更高效且易于實現(xiàn)。如圖8所示,利用FBO將textureA疊加在textureB上渲染成新的紋理textureB’,無glEnable()和glBendFunc()顯示glCopyTexImage。最后將疊加更新后的textureB’繪制到當(dāng)前屏幕緩存實現(xiàn)最終的顯示效果。
圖7 方位區(qū)間內(nèi)紋理顏色衰減
圖8 紋理的疊加
另外,通過glEnable()和glBendFunc()函數(shù)開啟OpenGL 的混色功能也是必需的步驟?;焐瘮?shù)選取宏定義GL_SRC_ALPHA 即ALPHA通道的顏色做混色源因子,并將宏定義GL_ONE_MINUS_SRC_ALPHA即(1-ALPHA通道顏色值)作為目標因子。
實驗使用的回波視頻數(shù)據(jù)分為4 096個方位。每個方位上記錄約1萬點的幅度值。每個方位數(shù)據(jù)發(fā)送間隔為1 ms。視頻數(shù)據(jù)通過網(wǎng)絡(luò)傳輸至雷達態(tài)勢顯示軟件,并采用本文介紹的方法進行繪制。
雷達態(tài)勢顯示軟件的開發(fā)運行環(huán)境為QT 4.8.3、銀河麒麟操作系統(tǒng)、飛騰FT1500A處理器、AMD 嵌入式RadeonTME8860顯卡。視頻刷新間隔為20 ms,視頻尾跡衰減系數(shù)為0.5。軟件運行效果如圖9、圖10及圖11所示。此方法實現(xiàn)的雷達回波視頻及其尾跡衰減效果理想,占用CPU資源低,回波視頻繪制執(zhí)行時間小于1 ms,整體運行流暢無卡頓。
雷達回波視頻數(shù)據(jù)實時性強,數(shù)據(jù)量大,國產(chǎn)化平臺CPU處理能力有限。本文用OpenGL的FBO和頂點、片段著色器特性實現(xiàn)雷達視頻和掃描線的繪制及尾跡衰減效果。方法有以下特點:
(1) 應(yīng)用Qt Graphics View框架和OpenGL特性實現(xiàn)的雷達回波視頻繪制為開發(fā)者提供高效便捷的方法,提高了雷達態(tài)勢顯示軟件穩(wěn)定性、可靠性和實用性。由于Qt及OpenGL移植性強,使得軟件可在國產(chǎn)化平臺下運行,具有更加廣泛應(yīng)用前景。
圖9 回波視頻及其尾跡繪制效果
圖10 視頻尾跡衰減效果
圖11 態(tài)勢顯示疊加效果
(2) 利用OpenGL可編程渲染管線特性,編寫頂點著色器進行了矩陣變換和數(shù)據(jù)傳遞,編寫片段著色器進行了數(shù)據(jù)換算、顏色混合和紋理采樣,最終實現(xiàn)了掃描線、回波視頻繪制及其尾跡衰減效果,從而將復(fù)雜運算和繪圖產(chǎn)生的負載從CPU轉(zhuǎn)移到GPU上,發(fā)揮了GPU并行處理的優(yōu)勢,有效平衡系統(tǒng)開銷。此方法不僅簡化了渲染管線的邏輯,而且提高了渲染效率,亦有效解決國產(chǎn)處理器的性能瓶頸。
(3) 通過OpenGL 的Alpha 通道混色功能設(shè)置源紋理和目標紋理的混合因子后,采用幀緩沖對象(FBO)對源紋理和目標紋理進行了疊加,從而提升了渲染效率和穩(wěn)定性,進一步提升基于國產(chǎn)化平臺的軟件實現(xiàn)可行性。
本文采用的方法對傳統(tǒng)機械掃描雷達的回波視頻數(shù)據(jù)繪制已通過實驗得到驗證。對于電子掃描陣列雷達,因雷達回波數(shù)據(jù)更新特性有差異,視頻軟件化繪制方法有待進一步展開研究。