陳宇峰,張 鉑,李 林
北京理工大學 計算機學院,北京 100081
電磁場被發現以來就一直是人類在生產生活過程中一種重要的物理環境。但是,電磁場難以被人的感官直接感受到,在某種程度上限制了人的觀察能力和思考范圍。因此,研究如何將這種看不見的電磁場及其與物質相互作用的現象能直接轉變為易被人的肉眼觀察到的方法,即電磁場可視化方法,具有重要的現實意義。
近年來對以雷達探測范圍為例的電磁場可視化的研究取得了日新月異的發展。伴隨著計算機圖形學的快速發展,雷達探測范圍可視化方法已經由傳統的數值參數、二維雷達威力圖方法轉為三維可視化技術[1]。國防科技大學的楊超,陳鵬等人研究了在大氣吸收衰減的條件下,雷達探測范圍并且生成了三維仿真場景[2]。空軍工程大學的張敬卓、袁修久等人為了解決在虛擬戰場環境下數據場內密外疏的難題,采用了數據環拼接的方式,最終實現了雷達在虛擬戰場環境下自然環境干擾的三維探測范圍可視化[3]。但是這些方法采用的都是面繪制,其缺點是邊緣提取不準確,并且容易造成數據場信息丟失。如果采用體繪制的方法可視化雷達探測范圍,可以很好地保留整體數據場的細節,然而體繪制采用的光線跟蹤算法對內存資源需求大,對場景雷達探測范圍的碰撞檢測效率低,所以并沒有被廣泛的使用。
體繪制起始于20世紀70年代中期,它是由于醫學技術斷層投影(CT)、核磁共振(MRI)等發展而興起的一種可視化技術。在醫學領域中,動態體繪制可視化技術龐大的數據量使得計算的復雜度大大提高,基于CUDA的高效體繪制技術可以進一步提高數據處理效率[4]。體繪制也是電磁場可視化仿真領域中的重要組成部分。其優點是不僅僅可以顯示高質量的圖片,而且這些圖片可以表達出三維物體的內部信息,這一點是傳統的計算機圖形學不可企及的[5-6]。基于以上的優點,體繪制技術更加適用于繪制不可見的數據場信息,例如,人體骨骼密度,雷達探測范圍等。然而體繪制方法的缺點就是算法執行的時間效率問題。由于從視點投射出的每一條光線都需要和場景進行碰撞檢測,所以體繪制效率改善的關鍵問題就是改善光線求交運算的碰撞檢測效率。
本文采用OSG(Open Scene Graph)作為渲染引擎。采用體繪制技術來可視化雷達探測范圍,實驗結果表明,OSG引擎對雷達探測范圍的體繪制的可視化效果良好。并且在OSG場景中針對體繪制渲染效率慢的缺點,實現了多核CPU+GPU體繪制的并行計算。最終較好地實現了電磁場的可視化,降低了可視化的渲染時間。
體繪制是將三維數據場的信息變換生成屏幕上的二維圖像。體繪制主要的方法有:
(1)光線投射算法(Ray Casting)。
(2)光線跟蹤算法(Splatting)。
(3)頻域體繪制算法(Shear-warp)。
(4)硬件輔助的三維紋理映射法(3D Texture Mapping)[7]。
光線跟蹤算法是現階段體繪制使用最多的方法,它是指從三維數據場中的視點繪制出覆蓋整個屏幕像素點的光線,并且查找阻擋光線最近的那個物體,然后根據材料的特性以及場景中光線的效果來確定渲染在二維圖片上的每一個像素點的顏色值。相比光線投射算法,光線跟蹤算法的重點并不是進行色彩的積累,如圖1所示,光線跟蹤算法僅僅只考慮光線和幾何體的相交情況。

圖1 采用光線跟蹤算法的電磁場可視化圖
本文采用了光線跟蹤算法,要求判斷每一條光線和模型的交點個數,從而確定二維圖像的像素值。因為每一次光線繪制和求交過程中數據之間不存在依賴,所以在光線繪制和求交計算過程是比較好的并行選擇。
光線是從視點到屏幕像素點的多條射線。根據交點的個數的不同對交點進行判斷,根據式(1)找出一個交點的坐標(xi,yi,zi)。其中(xi,yi,zi)分別表示第i個交點的坐標值,(oxi,oyi,ozi)分別表示第i個交點的雷達波發射中心的坐標值。

然后根據雷達波能量衰減函數,獲得該點的能量函數Pr;Pt表示雷達發射機峰值的功率;Gt表示發射天線增益;Gr表示接收天線增益;σ表示雷達反射截面積;τ表示雷達工作波長。如果假設發射天線增益和接收天線增益相等。式(2)可以表示為如下形式[8]:

最后按照式(3)將能量值轉化為光學屬性進行繪制,形成體繪制二維圖。其中Pixel表示的是渲染在投影平面上像素點的RGB和?值。

在上述過程中造成體繪制效率低主要表現在兩個方面:(1)在渲染場景中的使用光線跟蹤算法繪制光線;(2)光線跟蹤算法中光線和雷達波探測范圍模型的交點計算。本文針對雷達探測范圍體繪制的這兩個低效問題進行了改進,主要貢獻如下:(1)將電磁場能量值轉化為光學屬性在計算機中進行繪制;(2)采用GPU進行光線的繪制,采用多核CPU進行光線和電磁場探測范圍模型的交點計算。
張文波,曹耀欽等人將體繪制技術創新地運用在電磁場仿真領域,并且采用CUDA將電磁場傳播模型(ITM)的計算移植到GPU中進行,最終基于CUDA架構實現了較高的加速比[9]。但是這種方法有兩個缺陷:(1)ITM模型是一種高效預測電磁波衰減的模型,文章的加速效果受限于所選取的ITM模型;(2)電磁場體繪制技術的時間開銷主要表現在兩個方面:①在渲染引擎中繪制光線的計算。②電磁場數據的計算以及交點信息的計算。而上述方法僅僅改進了電磁場數據的計算以及交點計算,對于體繪制信息數據渲染的并行化算法并沒有涉及。
而本文針對這兩個時間開銷都進行了改進。在3.1節中使用GPU提高光線繪制的效率;在3.2節中使用多核CPU提高電磁場數據計算和交點計算效率。實驗表明,對于光線繪制效率的改進可以提高模型的可視化效果。
OSG(OpenSceneGraph)誕生于1990年,是C++編寫的、使用標準模板庫(STL)作為容器的圖形引擎。OSG使用場景圖的方法來構造3D世界,其中場景圖中的每一個NODE節點都是存在于場景中,并且與場景中的其他節點存在一定的從屬關系。OSG最大的優點是模塊化和可拓展性,并且容易學習,所以現如今受到了大多數計算機圖形學工作者的青睞[10]。
OSG場景圖是采用AABB包圍盒和包圍球技術來實現碰撞檢測的相交測試,并且對于碰撞檢測進行了類的封裝。這種封裝對于初學者來說可以快速地實現三維場景的碰撞檢測功能,但是其缺點是實現的功能僅限于是OSG自帶的碰撞檢測方法。如果開發者想要拓展新的方法來提高OSG程序執行的效率,則是非常困難的。
在第2章已經介紹了光線跟蹤算法在計算機中耗時最多的兩個步驟:(1)光線繪制;(2)相交檢測并根據交點的數量繪制像素點的顏色值。本文在3.1節和3.2節分別進行了時間效率的改進。
CUDA(Compute Unified Device Architecture)是由NVIDIA公司提出的建立在GPU上的統一計算架構。充分利用GPU強大的多線程浮點數計算能力和多計算核心的特點,可以將問題劃分為粗放子問題,以并行的方式獨立解決[11-12]。文獻[13]提出了CUDA所使用的從內存拷貝數據到顯存的方法很低效,這也正是使用CUDA架構進行并行計算編程的瓶頸所在。而光線繪制并不需要對大量的數據進行內存到顯存的拷貝,因此可以極大地發揮CUDA的多線程浮點數運算的特性。
光線繪制是指在視點和屏幕像素點之間分別繪制射線,射線指向屏幕像素點。視點的位置是固定不變的,因此光線繪制階段主要的任務就是確定屏幕像素點的坐標值。本文采用CUDA來計算屏幕像素點的坐標值。屏幕像素點的坐標值與如下幾個量有關:
(1)投影平面的分辨率。
(2)投影平面的起始點坐標值。
(3)投影平面的像素仿真步長。
(4)場景漫游器camera的坐標值。
以下內容將會介紹在OSG引擎中如何避免文獻[13]中提到的數據拷貝效率低下的問題,進一步介紹如何使用CUDA計算屏幕像素點坐標值。
本文光線繪制算法步驟如下:
CUDA輸入。投影平面的仿真步長(s_dx),投影平面起始點坐標值(m.x,m.y,m.z),場景漫游器camera的坐標值(p.x,p.y,p.z)。
CUDA輸出。繪制完成的若干光線。
步驟1 在顯存中申請大小為sizeof(float3)×THREAD_NUM×BLOCK_NUM的空間用于存放計算結果(其中BLOCK_NUM為CUDA內核開啟的線程塊數量,THREAD_NUM為每個CUDA線程塊開啟的線程數量)。
步驟2 CUDA計算階段:申請float3類型的變量dir來表示屏幕像素點的坐標值。
步驟2.1 CUDA的__global__函數中通過threadIdx.x和blockIdx.x函數獲得線程和線程塊的ID。
tid=threadIdx.x
bid=blockIdx.x
步驟2.2在__global__中分別計算dir的x、y、z坐標值。以計算dir的x值為例:
dir[bid×512+tid].x=(m.x+tid×s_dx)-p.x
步驟3 CUDA光線繪制階段:根據屏幕像素點的坐標值和camera的坐標值繪制光線向量。
此方法在CUDA內核中開啟了多線程,改進了光線繪制在內存中的單線程執行,節省了內存空間,提高了光線繪制效率。
在傳統的單核CPU架構中,通過提高CPU頻率來提高程序運行速度已經使CPU頻率發展到了極限。如今越來越多的多核CPU模型被設計出來,以此來充分利用CPU空閑資源。文獻[14-15]分析了一些現有的典型計算模型,以Jacobi迭代算法為例,說明了多核CPU模型可以改善運行的性能。文獻[16]通過以遺傳算法(GP)——機器學習的典型算法之一為例,證明了通過利用cache(高速緩沖存儲器),基于多核CPU的GP算法的實現可以達到與GPU同樣級別的效率。因此,多核CPU也是重要的計算資源,不應該忽略這種資源。
在本文中,投影平面像素點的顏色值與檢測到的交點數目有關。使用OSG+CUDA引擎進行光線交點計算的弊端是:有大量的數據需要從內存拷貝到顯存,由于OSG引擎的模塊化架構,數據從內存傳遞到顯存的時間消耗要近似等于CUDA提升的計算效率。因此,采用OSG+CUDA架構進行光線跟蹤的相交計算并不會很好地提高程序執行的效率。所以,本文采用利用多核CPU來處理交點計算任務。
光線跟蹤算法的交點計算部分從原理上說是不存在數據依賴的,因此光線相交計算的每一次迭代都是可以使用多核CPU進行并行化處理的。本文采用OpenMp來實現多核CPU的并行編程。
圖2是基于OSG體繪制方法的算法流程圖。
圖3是在同一個OSG場景下,關于雷達探測范圍面繪制和體繪制效果的對比。其中,圖3(a)和(b)是對同一個雷達發射源分別進行面繪制和加速體繪制的結果。從圖中可以看出,(a)圖中面繪制有明顯的塊狀效果,對背景數據保留得較少,有部分空間數據丟失。(b)圖中體繪制的結果比較連續,很好地保留了背景數據。(c)圖是投影平面和3D場景的側視圖。

表1 體繪制和加速體繪制耗時關系

圖2 基于OSG實現體繪制計算流程

圖3 雷達探測范圍面繪制與加速體繪制對比圖
運行參數設置:體繪制投影平面分辨率為1 024×1 024,THREAD_NUM設置為512,BLOCK_NUM設置為512,開啟8個線程計算射線交點。
(1)GPU:NVIDIA GeForce GTX 750Ti,顯存2 GB,顯存帶寬86.4 GB/s,時鐘頻率1 020 MHz,渲染到屏幕的像素點率16.3 GPixel/s。現階段屬于中端顯卡。
(2)CPU:Inter Core i7 2600,高速緩沖存儲器(cache memory)32 KB×4,4核8線程,主頻3.4 GHz,峰值時運算能力37.63 GFLOP/s。
分別使用分辨率為512×512、1 024×1 024、2 048×2 048的投影平面進行體繪制,采用以上的配置的計算機進行加速體繪制,結果如表1所示。
從表1中可以看出,對于OSG引擎來實現雷達波探測范圍的可視化效率較低。通過GPU光線繪制方法,可以極大程度地提升光線繪制的時間,加速比達到11~18倍。
(1)當投影屏幕分辨率為1 024×1 024時,基于OSG的交點計算耗時明顯增加,已經不滿足實時性的要求,通過多核CPU+GPU的加速體繪制算法,可以使交點計算的時間縮短到不到8 s。
(2)當投影屏幕分辨率為2 048×2 048時,基于OSG的交點計算耗時已經無法正常測量,采用多核CPU進行交點計算后可以改進這一缺陷。
圖4是本算法在大地形戰場環境中的應用效果展示圖,從圖中可以看出對三維數據場的體繪制方法可以保留大量的背景信息。

圖4 戰場環境中體繪制算法的應用
本文針對面繪制三維數據場帶來的空間信息丟失問題,采用體繪制算法彌補了這個問題,提高了可視化效果,并利用GPU和多核CPU的并行處理能力提高算法的執行效率。在OSG引擎下,實現了基于多核CPU+GPU的加速體繪制算法。可以完成對電磁場體繪制的實時渲染功能。本算法應用在戰場環境的雷達波體繪制仿真中,已經取得了很好的效果。