宋 歌,潘衛軍
(中國民用航空飛行學院空中交通管理學院,四川 廣漢 618307)
大氣散射是地球表面大氣層中一種重要的自然現象,由陽光與空氣中的微粒相互作用形成,如在地面上觀察到的藍天、紅日、霧霾等都是大氣散射產生的效果[1]。在飛行模擬機、塔臺視景模擬機等航空仿真系統中,大氣散射效果的仿真十分重要。大氣散射現象的仿真技術最早出現于20世紀80年代,當時由于大氣散射物理模型比較復雜和計算機硬件速度的限制,無法應用于實時性較高的航空仿真系統中。早期的大氣散射模擬通常采用天空紋理貼圖結合基于屏幕空間或粒子系統的霧效進行實時實現,這種方式的仿真結果真實性較差。Nishita[2]等根據瑞利散射和米氏散射方程,提出一種適用于地表范圍的大氣散射計算方程,奠定了當今大氣散射模擬的基礎;2002年,Dobashi[3]等首次提出基于圖形處理器(GPU)的大氣散射渲染算法;此后,O’Neil提出一種基于CPU的實現方法[4],其利用投射線技術計算散射積分,通過使用代表大氣外部和內部的兩個球體模型,避免耗時的體渲染。后O’Neil又使用GPU改進了該算法[5];Bruneton[6]等基于Nishita的大氣散射模型,提出一種CPU與GPU相結合的渲染方法,以球面模型為基礎,通過預先計算的3D紋理在GPU中確定紋理坐標,得到了真實度較高的大氣散射模擬結果。然而,針對地球橢球模型的特點,以上算法在坐標精度要求較高的航空仿真中容易出現局部效果失真的現象。
本文提出一種針對航空仿真的宏觀大規模場景,基于大氣散射物理模型的實時渲染方法。算法首先根據瑞利散射和米氏散射構建大氣散射的數學模型進行離線渲染,渲染結果保存至3D紋理,以供實時渲染時調用;在此基礎上,以地球實際尺寸構建橢球體的渲染模型;其次,使用密度積分的方法進行霧霾效果模擬,利用柏林噪聲實現霧霾的動態變化效果;最后,使用高動態范圍技術優化渲染圖像,形成最終實時渲染畫面。
本文渲染算法的基礎源自經典的瑞利(Rayleigh)散射和米氏(Mie)散射模型。
大氣層中的空氣分子直徑大約是入射光波波長的十分之一,其發生的散射現象稱之為瑞利散射。根據瑞利散射,相位方程βr(θ)描述了某一波長的光波在特定方向θ上的總量,其公式如下

(1)
其中,θ是光線和視線方向的的夾角,n是空氣散射系數,λ是光波長,N是空氣分子密度。
由式(1)可知,βr(θ)和光波長的4次方成反比,因此短波光(紫光、藍光等)的散射能力比較強。這也是晴朗天空呈藍色的原因。
對式(1)進行積分,便可得到總的散射系數βR
(2)
其中,R為參考球面模型的半徑,h為當前點的海拔高度。βR表示一條光束由散射形成的總光線量。
當大氣中粒子的直徑與輻射的波長相當時發生的散射稱之為米氏散射。米氏散射主要由大氣中的微粒,如煙、塵埃、小水滴及氣溶膠等引起。米氏散射的散射強度與波長的二次方成反比,并且散射在光線向前方向比向后方向更強,方向性比較明顯。米氏散射方程可以寫成
(3)
這里c是根據濁度T變化的濃度因子,它的計算公式是
c=(0.6544T-0.6510)·10-16
(4)
米氏散射比瑞利散射復雜,在實際應用中,通常使用近似的Henyey-Greenstein相位方程進行實時計算
(5)
其中,g是方向因子。
綜合瑞利散射和米氏散射,便可得到大氣散射的綜合數學模型
β(θ)=βR(θ)+αφHG(θ)
(6)
其中α表示米氏散射的強度。當α較大時,即表示大氣中大直徑微粒的散射作用較強,即可用來模擬現實中霧霾天氣的顯示效果。
根據大氣散射的綜合數學模型便可進行大氣散射的渲染計算。首先給出光程(如圖1所示)的定義。記L(x,v,s)為從方向v射向點x的總光量,其中s為太陽方向,x0(x,v)在光線x+tv的末端,可知x0位于地表和大氣頂部之間。

圖1 光程的定義
光程T在x0和x之間,定義如下
(7)
其中βi(y)是根據式(6)計算得來的散射系數。
將x0處的直接太陽光記為L0,當v≠s或者陽光被地形遮擋時L0=0。在x0處的反射光記為R[L](x,v,s),可知當x0位于大氣頂部時R[L]=0。從任意方向散射到由x到x0方向的光記為S[L](x,v,s),它們的表達式分別為
L0(x,v,s)=T(x,x0)Lsun或0
(8)

(9)

(10)
則最終得到L(x,v,s)的計算公式
L(x,v,s)=L0(x,v,s)+R[L](x,v,s)+S[L](x,v,s)
(11)
上述表達式表示:任意空間一點向任意方向發射射線,假定射線撞擊到了地表或是大氣層的邊緣(假定大氣是漸進衰減的一個過程),那么在這條路程上,進入攝像機的散射光照包含了地面被照亮的部分R[L](x,v,s)在該方向的散射分量以及路程中所有采樣點被照亮部分S[L](x,v,s)在該方向的散射分量,如圖2所示。其中,R[L](x,v,s)部分被考慮為以地表法線為中心方向的180°的半球區域的積分,而S[L](x,v,s)部分由于沒有任何阻攔,被考慮為球心積分模型。計算方法是預先求出發生一次散射以后在任意點任意方向的進光量,再以此為基準進行迭代,假定某一方向上所有采樣點的進光量是上一次一次散射的結果,搜集這些結果進行累加最后得到二次散射的結果,再進行下一次迭代。在本文提到的模型中,使用了三次迭代,最后得到了逼真的仿真結果。
由于GPU的限制,上述計算十分耗時,因此需借助渲染到紋理技術(Render-to-Texture),將一部分計算內容預先渲染保存至紋理,以節約渲染時間。然而,紋理過大也存在占用顯存的問題,這也會影響渲染效率。因此,本文定義了多張紋理文件,在實時渲染過程中根據需要進行紋理查找。
由于實時計算每個點的最終光照L(x,v,s)非常耗時,因此可以將不依賴于當前位置數據的計算結果進行預處理。例如光程,瑞利散射及米氏散射等,它們的結果可以預先計算并存儲在紋理中。在預處理的時候,提供了幾個索引作為自變量:攝像機所在的位置x(x,y,z),視點方向向量v(x,y,z),太陽相對于視點向量的夾角向量s(x,y,z)。上面九個變量可以縮減為4個自由度,它們依次為相機距離地心的高度,視線和相機離地心連線的夾角,太陽和視線方向的夾角(需要兩個自由度的夾角即可確定太陽位置)。這些自變量映射到0到1的定義域內,即可應用到紋理坐標上,從而達到離線渲染的目的。
利用上述計算方法容易得到基于球面模型的大氣散射渲染結果。然而,在航空仿真的實際應用中,坐標位置信息都是嚴格按照基于橢球面的大地坐標系解算的,球面模型的渲染結果必然會導致坐標精度損失,造成視覺效果的偏差。因此,在計算中考慮橢球模型是非常必要的。
本文采用WGS84坐標系,將地球連同周邊大氣層看作一個橢球面模型,設赤道半徑為Re,兩極半徑為Rp,地球某點所在緯度為θlat,則該點所在半徑長(即橢球心與該點的距離)為
(12)
其中f=(Re-Rp)/Re。
利用以上結果,代入式(2),便可得

(13)
其中r為當前點距離地球球心(參考橢球心)的距離。
利用式(13)的結果繼續上節所述計算,便可得到基于橢球體模型的大氣散射光照渲染結果。
霧霾是由于大氣散射作用下的一種常見天氣現象。其基本原理是大氣中大顆粒物質發生米氏散射導致的視覺效果變化。而霧與霾本身也有區別:霧主要是由空氣中懸浮的小水滴造成的,而霾則是由空氣中懸浮的固體微粒(如灰塵、硫酸、硝酸等各種化合物)造成的。霧霾視覺效果也有不同:霧的顏色呈乳白色或青白色,且對能見度的影響較大(一般在1公里內);而霾的顏色多呈灰色、黃色或橙灰色,對能見度影響不太大(一般在10公里內)。
利用大氣散射的數學模型能夠模擬霧霾的基本視覺效果,而針對霧霾的不同特點,則需進行額外的計算以準確表示能見度的不同與顏色的不同。
在航空仿真中,需要從不同高度和角度模擬霧效:如在飛行模擬的起飛降落階段需觀察霧霾在地面的視覺效果,而在飛行階段則需模擬從空中俯瞰霧霾以及在霧霾中飛行時穿梭霧霾的效果。此外,根據塔臺模擬機或飛行模擬機的訓練要求,仿真系統需能進行能見度距離的量化設置。這就需要霧霾的數學模型盡可能貼近真實情況,并能通過參數控制效果的變化。因此,在上章大氣渲染模型的基礎上,本文建立一個基于地球橢球體模型、密度逐漸變化的霧霾模型,通過計算密度積分,確定每個渲染片元的實際顯示顏色。
同基本大氣散射模型相同,霧霾模型同樣是基于橢球面的橢球體(如圖2所示)。該模型以地球表面為霧底,霧的高度以變量形式傳入GPU著色器,以便進行參數調節。此外,霧霾密度隨高度增加而減小。

圖2 霧霾渲染模型
對每一個片元(像素),霧霾密度可通過極坐標積分計算
(14)
其中,l是霧霾高度;r1是視點高度;r2是當前片元所處目標位置點的高度(這里的高度均表示和球心間的距離),d表示當前的能見度距離,dmax表示最大能見度距離。
霧霾顏色和大氣的顏色密切相關,其顏色可在大氣散射光照顏色的基礎上混合計算。在式(7)的基礎上,便有
Colorbase=T(x,x0)·Colorsun
(15)
其中Colorsun表示陽光的顏色,在仿真中用來模擬一天不同時刻的陽光光照的顏色變化。
考慮到霧霾的顏色區別,在上述結果中還需混合一個顏色使霧與霾的效果在仿真場景中予以區分,即
Colorfinal=α·Colorfog/haze+(1-α)·Colorbase
(16)
其中,α合系數。
通過以上計算,能夠得到較為逼真的靜態霧霾的渲染效果,而在實際飛行仿真應用中,由于飛機高速運動以及風速的影響,霧并非是靜態的,其密度是不均勻的,且能隨時間變換。本文采用柏林噪聲(Perlin Noise)[5]來實現動態霧效。
由于飛行仿真是在三維空間中進行的,為模擬霧霾的動態效果,理論上霧霾密度是可能在三個維度方向上均發生變化的。而實際過程中飛機的飛行高度變化是十分緩慢的,因此,動態變化效果只需考慮水平兩個維度的效果變化即可。因此,可將柏林噪聲以二維紋理的方式讀入即可。
為避免出現動態效果變化過快出現閃爍等走樣問題,在笛卡爾坐標系下,應根據世界坐標系中的(x,y)作為紋理坐標以循環取余的方式讀取噪聲紋理。由于本文場景所采用的坐標系為球坐標系,為簡便,可直接使用經緯值代替(x,y)進行紋理取值。在飛機飛行速度的限制下,球坐標于笛卡爾坐標系間的誤差是可忽略不計的。最后生成的噪聲為一個(0,1)間的浮點值,將其與霧霾密度相乘,便可表現出密度變化的效果。
雖然場景渲染是根據大氣散射物理模型計算出來的,最終由投影顯示設備輸出的視景畫面與真實場景效果仍存在一定差距。在真實的室外場景中,由于自然光的亮度范圍較大,人眼對的不同光照強度的視覺效果感知十分敏感。如同一場景在晴天和陰天時的視覺效果是截然不同的。而由于顯示設備的局限性,是無法直接模擬這樣的視覺效果差異。
為解決上述問題,本文使用高動態范圍(HDR)技術對渲染畫面進行處理。高動態范圍的實現原理簡單說,是使場景中亮的地方更亮,暗的地方更暗。這樣則在有限的亮度范圍內,提升畫面的對比度。設ColorHDR為渲染計算后的像素顏色,則有
(17)
其中c=0.4Colororiginal。
圖3給出了高動態范圍圖像優化前后的場景渲染效果對比。針對陰天的室外場景,左圖效果過于明亮,效果失真;而右圖在優化后,整體亮度趨于均衡,更能準確反映真實場景的效果。

圖3 高動態范圍圖像優化前后效果對比
實驗硬件配置為:CPU Intel Core i7-2600K 3.4GHz,8.00GB RAM,NVIDIA GeForce GTX 590顯卡;軟件環境為:Windows 7 64位旗艦版,Visual Studio 2012,OpenGL 4.3,著色器語言為GLSL。
首先,為了測試本章渲染方法的效率和穩定性,選取我國某山區復雜地形區域的場景進行模擬飛行漫游,統計使用本章渲染方法前后的幀率,并進行比較;其次,針對陸地場景,在飛行漫游中觀察和比較不同時刻、不同地點的大氣散射效果以及低能見度天氣的效果;最后,在不同能見度和不同視點高度條件下觀察霧的渲染效果。
5.2.1 渲染方法的效率與穩定性
模擬飛行漫游路徑如圖4所示。

圖4 實驗漫游路徑
圖5為利用本文場景建模方法開啟渲染效果前后的幀率對比圖。

圖5 場景渲染幀率比較
由實驗結果可知,本文渲染方法對最終渲染幀率的影響非常低,可以忽略不計。這是由于本文方法是將場景作為整體進行渲染計算的,因此與場景復雜度無關。此外,由于復雜的大氣散射模型計算是預先進行的,在實時渲染時只需進行紋理查找操作和少量的GPU著色計算,解決了場景渲染實時性與逼真度間的矛盾。
5.2.2 渲染結果
圖6給出了開啟大氣散射與關閉大氣散射的實際效果對比圖。由圖看出,開啟大氣散射的場景模擬圖像明顯更加真實。

圖6 大氣散射效果對比圖
圖7給出了霧和霾的渲染效果區別。

圖7 霧和霾的渲染效果對比圖
圖8和圖9分別給出地面和空中不同能見度下霧的渲染效果。

圖8 地面不同能見度的霧效渲染結果

圖9 空中不同能見度的霧效渲染結果
本文首先針對航空仿真的場景數據系統資源占用量大、渲染效率低的問題,提出了一種高效的渲染優化方法,其次提出了一種高效穩定的大氣散射渲染方法,解決了航空仿真對場景渲染實時性與逼真度兼顧要求的問題。該方法能將場景作為一個整體進行基于真實物理模型的渲染,效果逼真,幀率穩定,并且與場景復雜度無關,適用于對場景分辨率較高的航空仿真場景實時渲染。
本文的下一步研究方向是航空視景仿真的另一個重要仿真對象:高真實感云的繪制渲染。