唐 勇,劉智軒,郭慧玲,3,趙 靜,張曉碧
1(燕山大學 信息科學與工程學院,河北 秦皇島 066004)2(河北省計算機虛擬技術與系統集成重點實驗室,河北 秦皇島 066004)3(河北環境工程學院 信息工程系,河北 秦皇島 066102)
計算機圖形學領域中,研究學者們希望通過計算機再現真實世界,而在真實世界中自然現象是最具有挑戰性的課題.云是一種復雜的自然現象,在不同高度的云具有不同的表現形態,由于其特殊的物理構成,在光照方面有著復雜的情況.云作為自然現象的重要組成部分,是圖形學領域中重要的研究課題.體積云作為三維云可以滿足更高的真實性要求,在光照方面也因具有三維特征有更好的表現力.實時體積云模擬適用于游戲,動畫,影視等場景.
在云建模上研究學者們研究出了大量方法.Dobashi[1]等人提出使用元胞自動機模擬云的方法,通過對每個元胞自動機上的三個二元屬性進行屬性設置模擬三維云,這種方法的運算開銷巨大,難以達到實時.Schpok[2]等人提出使用Perlin噪聲生成云的方法,通過對Perlin噪聲進行一系列操作得到連續隨機的云密度,然后在空間中使用噪聲對空間進行干擾生成云.雖然生成的云效果較好,但該方法為離線渲染且無法進行大規模場景的云模擬.唐勇等人[3]使用NS方程對云進行模擬,同樣無法用于大規模場景的云模擬.KALLWEIT[4]提出了使用蒙特卡羅積分和神經網絡模擬云的方法,該方法需要預先學習大量光照方向和空間分布.Prashant和Fabrice[5]提出了一種混合物理方法,將包裹體內粗糙的拉格朗日模型與體積噪聲的程序放大器相結合,通過GPU加速達到實時,缺點為云的分布于形狀不夠真實,并且隨著包裹體的增加,幀率下降嚴重.Parga[6]通過使用高斯方程減少模擬過程中所需元球的數量,渲染使用低分辨率噪聲增強視覺效果,雖然達到實時,但是在云的細節上效果不佳.
云的光照模型直接決定云的視覺效果,是云模擬中的研究重點.Dobashi等人提出基于廣告牌的Splatting算法,計算了光的單次散射,光由被散射的陽光和穿過云層的光構成.可渲染出光線透過云層的效果,由于基于廣告牌所以是二維的云.Harris和Lastra[7]改進了Dobashi的方法,將單次散射改進為多次前向散射,通過對每個粒子求解多次散射公式可以得到更加明亮的云,此方法能在10K粒子以下可以達到實時渲染.Bouthor[8]提出了一種多重各向異性散射方法,通過迭代計算光路在云表面每個區塊中像素的能量傳輸,在密度不均勻的像素上使用Mie相位函數計算單次散射,通過改變不透明度以調整透射效果,該種方法極大的提升了光照的效果,但是需要非常大的計算量,無法達到實時.Elek[9]提出一種模擬云層中光傳輸的新算法,引入了Henyey-Greenstein函數存儲和重建照明信息,并且能夠使用單一方向表示各項異性分布.
綜上所述,現有模擬方法大多著眼于小規模云模擬,大規模場景云模擬方法較少,為數不多的大規模場景云模擬又存在云的分布或形狀不自然的問題,本文針對大規模場景云模擬提出了有效的體積云實時模擬方法,為了在保證實時的前提下解決云形狀不夠真實的問題,本文使用三維Simplex噪聲和三維Worley噪聲共同進行云建模,并且引入Curl噪聲為云增加不規則性與翻騰的效果[10].為了解決云的分布不自然的問題,對處理過的噪聲進行采樣,根據采樣得到的密度計算云的密度,從而生成分布連續且自然的云.為了保證能夠實時渲染體積云,在光照模型上使用大氣中的比爾-蘭伯特定律與HG相位函數求解,并且計算來自太陽和天空和地面反射的環境光.最后渲染出大規模環境下體積云的實時繪制效果.
使用噪聲紋理進行云建模的大部分方法使用的是二維噪聲,這樣建模得到一層片狀的二維云,本文為了得到效果更好的體積云,所以使用三維噪聲進行云建模,同時為了解決單一噪聲進行云建模效果真實性較差的問題,本文使用兩種噪聲共同對云進行建模,一種是Simplex噪聲,另一種是Worley噪聲.
由于Perlin噪聲具有明顯的偽影,使用基于數學概念單形(Simplex)對Perlin噪聲改進的Simlex噪聲,憑借單形的特性解決了一些Perlin噪聲的局限,降低了計算復雜度,最為顯著的是大大減少了高維度上的計算開銷,在硬件上更容易實現.本文根據McEwan[11]文中在GPU上實現生成2D simplex噪聲的方法與stefan[12]對Simplex噪聲的深入解釋,提出一種在GPU上生成3D Simplex噪聲的方法.
只使用Simplex噪聲進行云建模有細節不足的問題,由于Worley噪聲的計算過程是先劃分區塊,進行特征點填充,再計算當前區塊與相鄰區塊內的特征點之間的最小距離.所以可以產生類似石頭、水紋和細胞的球形紋理.可以較好的彌補使用Simplex噪聲進行云建模的不足,使生成的云具有翻滾飄渺的形狀,從而有更好的細節表現,以增加真實感.
使用此時的噪聲進行云建模生成的云具有明顯的團塊特征,與現實中的云相距甚遠.而噪聲有著和正弦波一樣的振幅和頻率,由波的疊加可知,不同倍頻的噪聲可以很容易疊加得到更隨機的波形.通過疊加頻率更小的噪聲可以得到細節程度更加豐富的紋理,從而可以為生成的云增加細節,有效的解決團塊問題.這種方法被稱為fbm,如公式(1)所示:
(1)
其中n為迭代次數,w為降低振幅的比例,s為提高頻率的倍數.
噪聲作為程序紋理具有偽隨機性,在使用的時候沒有必要每次重新生成,因此用于云建模的噪聲紋理是預先生成的三維紋理,為了保證云建模的連續性,使用的兩種三維噪聲紋理必須是可平鋪紋理,其中高分辨率的紋理作為云建模的形態紋理,低分辨率的紋理為作為云建模的細節紋理,為云的邊緣增加細節.他們都有RGBA四個通道,兩種紋理在不同通道中使用不同的噪聲填充,形態紋理R通道為Simplex噪聲,另外三個通道為三個不同頻率的Worley噪聲,細節紋理前三個通道為不同頻率的Worley噪聲,A通道不繪制紋理.表1為兩種紋理的細節.
表1 噪聲紋理細節
Table 1 Noise texture detail

紋理分辨率RGBA形態紋理細節紋理128?128?12864?64?64SimplexWorleyWorleyWorleyWorleyWorleyWorley-
利用上述多噪聲進行體積云建模獲得的效果細節仍有待加強,于是引入Curl噪聲加強干擾細節紋理,以增加云的不規則性和翻騰的效果.
Curl噪聲是基于Perlin噪聲的湍流速度場,這個速度場的是一個無源場,即散度處處為零.而這個條件是滿足不可壓縮流體的基本條件,所以能保證視覺上的可信.
當光線照射在不同的物體上時,因材質不同有著不同的效果:被吸收、被散射和被反射.而云幾乎可以認為是由小液滴構成的,當一束光線照射到小液滴時幾乎只有反射和折射,這也是為什么云看起來那么明亮的原因,一束強度為L的光線從云中穿過后強度會衰減,計算公式為式(2):
L(x,ω)=e-σtΔxL(x+Δxω,ω)
(2)
其中,ω是視線方向,x是光線從云中射出的位置與方向,Δx是光線射入云的位置到射出云的位置行進的距離,e-σtΔx是大氣中的Beer-Lambert定律,用于求解透射率.
由于現實中的云在光照充足的情況下有銀邊效果,可以使用相位函數計算,并且相位函數還能夠計算散射光的角度和強度.云中的水滴比空氣中的分子要大的多,所以云中的散射主要是Mie散射.由于Mie散射理論的復雜性,導致其相位函數難以計算.而Henyey-Greenstein相位函數可以有效的模擬Mie散射的前向散射的特性,并且計算難度比Mie散射簡單許多,可以大大減少計算量.圖1為兩種相位函數的效果對比圖,可以明顯看出HG相位函數在前向散射上有與Mie散射近似,在后向散射表現略差.所以本文為出于真實性與實時性的角度考慮選擇使用HG相位函數計算散射.公式(3)為HG相位函數
(3)
其中,θ為散射角度,g為非對稱因子g=cosθ,取值范圍為-1到+1,對應著不同的內部散射角度.

圖1 相位函數圖,實線:Mie,虛線:Henyey-Greenstein,g=0.99Fig.1 Phase function diagram,solid line:Mie,dotted line:Henyey-Greenstein,g=0.99
通過上述描述得到需要求解的公式(4):
(4)
其中D是光線在云中需要追蹤的距離,τ(x,x′)是光學深度,表示從x到x′路徑累加關于σt的積分,當σt的路徑長度是常數Δx可以使用τ(x)=σt(x)Δx簡化公式(4),此時將路徑分為多段長度相同的路徑,σS(x′)表示散射的求解,p(ω,ω′)表示ω到ω′的相位函數,Li(x′,ω′)表示計算從ω′到達x′的入射光線,Ω4π表示所有方向的球體.
所有光源可以分為3個部分:來自太陽的直接照射,來自太陽的間接照射和來自天空的間接照射.此時公式(4)后半部分的積分轉化為求解兩部分光照,難以計算的部分是來自天空的間接照射.化簡剩余的積分,計算從太陽和周圍環境到x′的入射光線,通過σS(x′)計算散射,在x到x′之間因為光線的損耗,在計算之后僅能觀察到光線的一部分,計算下一段dx′.繼續簡化,將光線在云中的透射率分成多段透射率求解,使用遞歸可以輕松算出結果,并且大大減少了計算量.使用公式(5)化簡透射率求解部分:
(5)
其中x為光線入射的起點,Δx為光線離散化的步長,i為在云中進行離散化的步數.
環境光對于云的真實感具有非常重要的作用,在求解時將云看成是厚度無限且密度均勻的平板.
此時的密度是從上文進行多次光線追蹤的計算中得到,來自天空和太陽的環境光可以使用密度除以4π和一個高階散射損失因子計算.假設在點P計算環境光照,P點的光可能來自各個方向,主要可分為來自太陽和天空的頂部光和來自地面反射的底部光,對于頂部各向同性的環境光通過公式(6)求解.
(6)

(7)
其中積分部分為指數積分,由于是封閉的所以計算簡單.
同理,將公式(7)中′+′換為′-′可以得到底部的環境光求解公式.
使用Raymarching方法渲染體積云,模擬陽光穿過體積云的過程,首先對需要使用到的噪聲進行采樣,在光線行進的每個步長中,使用采樣的數據與云的覆蓋率共同求解云的密度,使用每個像素上云的密度計算該像素上云的顏色與透明度.光線使用給定步長繼續行進,直到透明度達到完全透明或光線到達體積云的邊界.
為了獲得像素的透明度,首先計算沿著光線每段步長中的透射率,然后將光線的透射率的進行求和.這是根據光照部分的Beer-Lambert定律在射線行進中進行求解.
為了計算云中每個像素的顏色,需要在每個步長中計算光照和環境光.在光照的計算中,從視點開始向太陽發射光線,通過射線球交點方法計算云的頂層和底層與光線的交點,并且再次使用Beer-Lambert定律來計算沿著該光線的透射率.通過光線的方向與光線角度求解Henyey-Greenstein相位函數.
實驗平臺為Inter(R)Core(TM)i7-5820K CPU 3.30GHz、16G RAM、顯卡為NVIDIA GeForce GTX 1070,操作系統為64位Windows 10.
圖2為使用本文方法生成的三種類型的云,圖2(a)是積云,形態仿佛是棉花堆.當陽光斜射時,積云的明暗面很明顯,如果陽光和云在同一方向,則云的中央陰暗,邊緣特別明亮.圖2(b)是高積云,常連成一片,底部成波浪狀,其式樣很多.圖2(c)是層積云個體比高積云更大,外型柔和,結構不太明顯.連成一片時底部具有波浪型態和明暗相間的灰色陰影.本文方法可以較好的模擬上述的三種云,并且能夠達到實時.
圖3為使用本文方法在不同時刻模擬的高積云,挑選了三個比較有代表性的時刻:圖3(a)正午、圖3(b)傍晚和圖3(c)夜間,三個時刻模擬的是同一種云,每個時刻有不同的太陽位置,所以光線的方向各不相同,光線的顏色也不相同.正午太陽在最高點云的表現較為通透;傍晚太陽在側面云的表現為銀邊效果;夜間月亮光線不足時,能夠清晰的觀察到云的輪廓,月亮下的云具有銀邊效果.本文可以較好的模擬出不同時刻光照條件下的云.

圖2 不同種類的云Fig.2 Different kinds of clouds
表2為圖2與圖3中各個場景的平均幀率,可以看出各場景均可達到60FPS以上,所以本文的方法可以做到大規模場景體積云的實時模擬.

圖3 不同時刻的云Fig.3 Clouds at different moments
圖4為本文方法模擬的云與云的照片的比較,圖4(a)為本文模擬的效果,圖4(b)為真實的照片,可以看出本文的模擬效果在近處可以達到與真實照片近似的效果,由于需要保證實時性,在視點的遠端不進行過多的渲染.
表2 各場景幀率
Table 2 Frame rate of each scene

場景積云高積云層積云正午傍晚夜間幀率134125148134136136

圖4 與真實的云對比Fig.4 Compare with real clouds
圖5為使用Perlin噪聲生成的云與本文方法生成的云的對比,圖5(a)為使用Perlin噪聲的效果,圖5(b)為本文的效果,可以看出本文方法在云的邊緣細節繪制效果明顯強于只使用Perlin噪聲的效果.
圖6為與文獻[4]的效果對比,文獻[4]使用蒙特卡羅積分和神經網絡的方法,通過對已有的十多個云樣本學習后再進行云模擬.圖6(a)為文獻[4]渲染34小時的效果,圖6(b)為本文場景中一朵云的效果,文獻[4]的云效果非常好,但是需要先預先學習多個樣本,而且需要長時間渲染,無法達到實時,本文的云在層次細節與光照上無法達到文獻[4]的效果,但有利于游戲等虛擬場景中進行大規模實時繪制.

圖5 與Perlin噪聲的云對比Fig.5 Compare with Perlin noise clouds

圖6 與文獻[4]對比Fig.6 Compare with the literature [4]
圖7為與文獻[5]的效果對比,文獻[5]使用拉格朗日模型與體積噪聲相結合的混合物理方法,能基于物理控制云的生成,但是在云的分布和細節上較差.圖7(a)是文獻[5]在圓球中大規模體積云模擬的效果,圖7(b)是本文的效果,在云的分布上本文效果更加自然,云的形狀效果更優.

圖7 與文獻[5]對比Fig.7 Compare with the literature [5]
圖8為與文獻[6]的效果對比,文獻[6]使用基于元球的方法,通過求解高斯公式減少模擬過程中元球的數量,并且使用低分辨率的Perlin噪聲為云的邊緣增加細節.圖8(a)為文獻[6]的效果,圖8(b)為本文場景中一朵云的效果,文獻使用元球所以云的形態不如本文的連續.

圖8 與文獻[6]對比Fig.8 Compare with the literature [6]
表3為不同實驗方法的幀率對比,文獻[4]與文獻[6]是小規模云模擬,大多著眼于一朵云的模擬,而文獻[4]由于通過深度學習進行光照計算,計算量過大只能進行離線渲染,渲染時間從幾分鐘到幾十小時不等,并且對計算機硬件要求極高;文獻[6]將多個元球組成云,云的形狀可控性強,但視覺效果往往不夠自然,該方法可實時繪制,當視點離云越近幀率越低;文獻[5]與本文為大規模云模擬,文獻[5]在圓球中繪制云,每個圓球繪制一朵云,當繪制85個圓球時幀率為7,34個圓球幀率為24,14個圓球幀率為77,平衡了真實性與實時性,因為使用的是混合方法所以在視覺效果上較差;本文在空間中對云的密度采樣,以保證大規模場景中不同種類的云建模的時候不會嚴重影響實時性,通過將光照模型分解化簡大大減少計算量,同時使用多種噪聲進行建模,保證了云的視覺效果.
表3 不同實驗方法的幀率對比
Table 3 Frame rate comparison of different experimental methods
在使用Simplex噪聲的基礎上引入Worley噪聲共同生成三維噪聲,從云建模的層面上增強了云的真實感.由于噪聲具有偽隨機性,為了建模過程中減少噪聲的生成時間,所以將所使用的噪聲進行預生成處理以提高建模效率.同時引入了Curl噪聲增強了體積云細節的不規則性和翻騰效果的真實性.根據光在云中傳播的規律求解光照模型,通過大氣中的Beer-Lambert定律求解光線的透射率,HG相位函數散射光的角度分布和強度,并且分別計算云的頂部與底部的環境光.最后使用Raymarching進行體積云渲染.實驗結果表明本文方法可以對多種云進行有效的模擬,具有普適性;并且可以模擬出不同時刻光照條件下的云;并且在不同的云與不同的時刻下平均幀率均可達到60以上,能夠滿足實時性;并且模擬的云可接近真實的云.
今后的工作為以下兩個方面:
1)根據已有的圖像生成云,實現云生成的可控性;
2)改進散射效果,在保證實時的前提下,對相位函數進行改進,以獲得比HG相位函數更好的后向散射效果,從而增加云的真實性.