唐 勇,劉智軒,郭慧玲,3,趙 靜,張曉碧
1(燕山大學(xué) 信息科學(xué)與工程學(xué)院,河北 秦皇島 066004)2(河北省計算機(jī)虛擬技術(shù)與系統(tǒng)集成重點實驗室,河北 秦皇島 066004)3(河北環(huán)境工程學(xué)院 信息工程系,河北 秦皇島 066102)
計算機(jī)圖形學(xué)領(lǐng)域中,研究學(xué)者們希望通過計算機(jī)再現(xiàn)真實世界,而在真實世界中自然現(xiàn)象是最具有挑戰(zhàn)性的課題.云是一種復(fù)雜的自然現(xiàn)象,在不同高度的云具有不同的表現(xiàn)形態(tài),由于其特殊的物理構(gòu)成,在光照方面有著復(fù)雜的情況.云作為自然現(xiàn)象的重要組成部分,是圖形學(xué)領(lǐng)域中重要的研究課題.體積云作為三維云可以滿足更高的真實性要求,在光照方面也因具有三維特征有更好的表現(xiàn)力.實時體積云模擬適用于游戲,動畫,影視等場景.
在云建模上研究學(xué)者們研究出了大量方法.Dobashi[1]等人提出使用元胞自動機(jī)模擬云的方法,通過對每個元胞自動機(jī)上的三個二元屬性進(jìn)行屬性設(shè)置模擬三維云,這種方法的運(yùn)算開銷巨大,難以達(dá)到實時.Schpok[2]等人提出使用Perlin噪聲生成云的方法,通過對Perlin噪聲進(jìn)行一系列操作得到連續(xù)隨機(jī)的云密度,然后在空間中使用噪聲對空間進(jìn)行干擾生成云.雖然生成的云效果較好,但該方法為離線渲染且無法進(jìn)行大規(guī)模場景的云模擬.唐勇等人[3]使用NS方程對云進(jìn)行模擬,同樣無法用于大規(guī)模場景的云模擬.KALLWEIT[4]提出了使用蒙特卡羅積分和神經(jīng)網(wǎng)絡(luò)模擬云的方法,該方法需要預(yù)先學(xué)習(xí)大量光照方向和空間分布.Prashant和Fabrice[5]提出了一種混合物理方法,將包裹體內(nèi)粗糙的拉格朗日模型與體積噪聲的程序放大器相結(jié)合,通過GPU加速達(dá)到實時,缺點為云的分布于形狀不夠真實,并且隨著包裹體的增加,幀率下降嚴(yán)重.Parga[6]通過使用高斯方程減少模擬過程中所需元球的數(shù)量,渲染使用低分辨率噪聲增強(qiáng)視覺效果,雖然達(dá)到實時,但是在云的細(xì)節(jié)上效果不佳.
云的光照模型直接決定云的視覺效果,是云模擬中的研究重點.Dobashi等人提出基于廣告牌的Splatting算法,計算了光的單次散射,光由被散射的陽光和穿過云層的光構(gòu)成.可渲染出光線透過云層的效果,由于基于廣告牌所以是二維的云.Harris和Lastra[7]改進(jìn)了Dobashi的方法,將單次散射改進(jìn)為多次前向散射,通過對每個粒子求解多次散射公式可以得到更加明亮的云,此方法能在10K粒子以下可以達(dá)到實時渲染.Bouthor[8]提出了一種多重各向異性散射方法,通過迭代計算光路在云表面每個區(qū)塊中像素的能量傳輸,在密度不均勻的像素上使用Mie相位函數(shù)計算單次散射,通過改變不透明度以調(diào)整透射效果,該種方法極大的提升了光照的效果,但是需要非常大的計算量,無法達(dá)到實時.Elek[9]提出一種模擬云層中光傳輸?shù)男滤惴?引入了Henyey-Greenstein函數(shù)存儲和重建照明信息,并且能夠使用單一方向表示各項異性分布.
綜上所述,現(xiàn)有模擬方法大多著眼于小規(guī)模云模擬,大規(guī)模場景云模擬方法較少,為數(shù)不多的大規(guī)模場景云模擬又存在云的分布或形狀不自然的問題,本文針對大規(guī)模場景云模擬提出了有效的體積云實時模擬方法,為了在保證實時的前提下解決云形狀不夠真實的問題,本文使用三維Simplex噪聲和三維Worley噪聲共同進(jìn)行云建模,并且引入Curl噪聲為云增加不規(guī)則性與翻騰的效果[10].為了解決云的分布不自然的問題,對處理過的噪聲進(jìn)行采樣,根據(jù)采樣得到的密度計算云的密度,從而生成分布連續(xù)且自然的云.為了保證能夠?qū)崟r渲染體積云,在光照模型上使用大氣中的比爾-蘭伯特定律與HG相位函數(shù)求解,并且計算來自太陽和天空和地面反射的環(huán)境光.最后渲染出大規(guī)模環(huán)境下體積云的實時繪制效果.
使用噪聲紋理進(jìn)行云建模的大部分方法使用的是二維噪聲,這樣建模得到一層片狀的二維云,本文為了得到效果更好的體積云,所以使用三維噪聲進(jìn)行云建模,同時為了解決單一噪聲進(jìn)行云建模效果真實性較差的問題,本文使用兩種噪聲共同對云進(jìn)行建模,一種是Simplex噪聲,另一種是Worley噪聲.
由于Perlin噪聲具有明顯的偽影,使用基于數(shù)學(xué)概念單形(Simplex)對Perlin噪聲改進(jìn)的Simlex噪聲,憑借單形的特性解決了一些Perlin噪聲的局限,降低了計算復(fù)雜度,最為顯著的是大大減少了高維度上的計算開銷,在硬件上更容易實現(xiàn).本文根據(jù)McEwan[11]文中在GPU上實現(xiàn)生成2D simplex噪聲的方法與stefan[12]對Simplex噪聲的深入解釋,提出一種在GPU上生成3D Simplex噪聲的方法.
只使用Simplex噪聲進(jìn)行云建模有細(xì)節(jié)不足的問題,由于Worley噪聲的計算過程是先劃分區(qū)塊,進(jìn)行特征點填充,再計算當(dāng)前區(qū)塊與相鄰區(qū)塊內(nèi)的特征點之間的最小距離.所以可以產(chǎn)生類似石頭、水紋和細(xì)胞的球形紋理.可以較好的彌補(bǔ)使用Simplex噪聲進(jìn)行云建模的不足,使生成的云具有翻滾飄渺的形狀,從而有更好的細(xì)節(jié)表現(xiàn),以增加真實感.
使用此時的噪聲進(jìn)行云建模生成的云具有明顯的團(tuán)塊特征,與現(xiàn)實中的云相距甚遠(yuǎn).而噪聲有著和正弦波一樣的振幅和頻率,由波的疊加可知,不同倍頻的噪聲可以很容易疊加得到更隨機(jī)的波形.通過疊加頻率更小的噪聲可以得到細(xì)節(jié)程度更加豐富的紋理,從而可以為生成的云增加細(xì)節(jié),有效的解決團(tuán)塊問題.這種方法被稱為fbm,如公式(1)所示:
(1)
其中n為迭代次數(shù),w為降低振幅的比例,s為提高頻率的倍數(shù).
噪聲作為程序紋理具有偽隨機(jī)性,在使用的時候沒有必要每次重新生成,因此用于云建模的噪聲紋理是預(yù)先生成的三維紋理,為了保證云建模的連續(xù)性,使用的兩種三維噪聲紋理必須是可平鋪紋理,其中高分辨率的紋理作為云建模的形態(tài)紋理,低分辨率的紋理為作為云建模的細(xì)節(jié)紋理,為云的邊緣增加細(xì)節(jié).他們都有RGBA四個通道,兩種紋理在不同通道中使用不同的噪聲填充,形態(tài)紋理R通道為Simplex噪聲,另外三個通道為三個不同頻率的Worley噪聲,細(xì)節(jié)紋理前三個通道為不同頻率的Worley噪聲,A通道不繪制紋理.表1為兩種紋理的細(xì)節(jié).
表1 噪聲紋理細(xì)節(jié)
Table 1 Noise texture detail
紋理分辨率RGBA形態(tài)紋理細(xì)節(jié)紋理128?128?12864?64?64SimplexWorleyWorleyWorleyWorleyWorleyWorley-
利用上述多噪聲進(jìn)行體積云建模獲得的效果細(xì)節(jié)仍有待加強(qiáng),于是引入Curl噪聲加強(qiáng)干擾細(xì)節(jié)紋理,以增加云的不規(guī)則性和翻騰的效果.
Curl噪聲是基于Perlin噪聲的湍流速度場,這個速度場的是一個無源場,即散度處處為零.而這個條件是滿足不可壓縮流體的基本條件,所以能保證視覺上的可信.
當(dāng)光線照射在不同的物體上時,因材質(zhì)不同有著不同的效果:被吸收、被散射和被反射.而云幾乎可以認(rèn)為是由小液滴構(gòu)成的,當(dāng)一束光線照射到小液滴時幾乎只有反射和折射,這也是為什么云看起來那么明亮的原因,一束強(qiáng)度為L的光線從云中穿過后強(qiáng)度會衰減,計算公式為式(2):
L(x,ω)=e-σtΔxL(x+Δxω,ω)
(2)
其中,ω是視線方向,x是光線從云中射出的位置與方向,Δx是光線射入云的位置到射出云的位置行進(jìn)的距離,e-σtΔx是大氣中的Beer-Lambert定律,用于求解透射率.
由于現(xiàn)實中的云在光照充足的情況下有銀邊效果,可以使用相位函數(shù)計算,并且相位函數(shù)還能夠計算散射光的角度和強(qiáng)度.云中的水滴比空氣中的分子要大的多,所以云中的散射主要是Mie散射.由于Mie散射理論的復(fù)雜性,導(dǎo)致其相位函數(shù)難以計算.而Henyey-Greenstein相位函數(shù)可以有效的模擬Mie散射的前向散射的特性,并且計算難度比Mie散射簡單許多,可以大大減少計算量.圖1為兩種相位函數(shù)的效果對比圖,可以明顯看出HG相位函數(shù)在前向散射上有與Mie散射近似,在后向散射表現(xiàn)略差.所以本文為出于真實性與實時性的角度考慮選擇使用HG相位函數(shù)計算散射.公式(3)為HG相位函數(shù)
(3)
其中,θ為散射角度,g為非對稱因子g=cosθ,取值范圍為-1到+1,對應(yīng)著不同的內(nèi)部散射角度.
圖1 相位函數(shù)圖,實線: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′)是光學(xué)深度,表示從x到x′路徑累加關(guān)于σt的積分,當(dāng)σt的路徑長度是常數(shù)Δx可以使用τ(x)=σt(x)Δx簡化公式(4),此時將路徑分為多段長度相同的路徑,σS(x′)表示散射的求解,p(ω,ω′)表示ω到ω′的相位函數(shù),Li(x′,ω′)表示計算從ω′到達(dá)x′的入射光線,Ω4π表示所有方向的球體.
所有光源可以分為3個部分:來自太陽的直接照射,來自太陽的間接照射和來自天空的間接照射.此時公式(4)后半部分的積分轉(zhuǎn)化為求解兩部分光照,難以計算的部分是來自天空的間接照射.化簡剩余的積分,計算從太陽和周圍環(huán)境到x′的入射光線,通過σS(x′)計算散射,在x到x′之間因為光線的損耗,在計算之后僅能觀察到光線的一部分,計算下一段dx′.繼續(xù)簡化,將光線在云中的透射率分成多段透射率求解,使用遞歸可以輕松算出結(jié)果,并且大大減少了計算量.使用公式(5)化簡透射率求解部分:
(5)
其中x為光線入射的起點,Δx為光線離散化的步長,i為在云中進(jìn)行離散化的步數(shù).
環(huán)境光對于云的真實感具有非常重要的作用,在求解時將云看成是厚度無限且密度均勻的平板.
此時的密度是從上文進(jìn)行多次光線追蹤的計算中得到,來自天空和太陽的環(huán)境光可以使用密度除以4π和一個高階散射損失因子計算.假設(shè)在點P計算環(huán)境光照,P點的光可能來自各個方向,主要可分為來自太陽和天空的頂部光和來自地面反射的底部光,對于頂部各向同性的環(huán)境光通過公式(6)求解.
(6)
(7)
其中積分部分為指數(shù)積分,由于是封閉的所以計算簡單.
同理,將公式(7)中′+′換為′-′可以得到底部的環(huán)境光求解公式.
使用Raymarching方法渲染體積云,模擬陽光穿過體積云的過程,首先對需要使用到的噪聲進(jìn)行采樣,在光線行進(jìn)的每個步長中,使用采樣的數(shù)據(jù)與云的覆蓋率共同求解云的密度,使用每個像素上云的密度計算該像素上云的顏色與透明度.光線使用給定步長繼續(xù)行進(jìn),直到透明度達(dá)到完全透明或光線到達(dá)體積云的邊界.
為了獲得像素的透明度,首先計算沿著光線每段步長中的透射率,然后將光線的透射率的進(jìn)行求和.這是根據(jù)光照部分的Beer-Lambert定律在射線行進(jìn)中進(jìn)行求解.
為了計算云中每個像素的顏色,需要在每個步長中計算光照和環(huán)境光.在光照的計算中,從視點開始向太陽發(fā)射光線,通過射線球交點方法計算云的頂層和底層與光線的交點,并且再次使用Beer-Lambert定律來計算沿著該光線的透射率.通過光線的方向與光線角度求解Henyey-Greenstein相位函數(shù).
實驗平臺為Inter(R)Core(TM)i7-5820K CPU 3.30GHz、16G RAM、顯卡為NVIDIA GeForce GTX 1070,操作系統(tǒng)為64位Windows 10.
圖2為使用本文方法生成的三種類型的云,圖2(a)是積云,形態(tài)仿佛是棉花堆.當(dāng)陽光斜射時,積云的明暗面很明顯,如果陽光和云在同一方向,則云的中央陰暗,邊緣特別明亮.圖2(b)是高積云,常連成一片,底部成波浪狀,其式樣很多.圖2(c)是層積云個體比高積云更大,外型柔和,結(jié)構(gòu)不太明顯.連成一片時底部具有波浪型態(tài)和明暗相間的灰色陰影.本文方法可以較好的模擬上述的三種云,并且能夠達(dá)到實時.
圖3為使用本文方法在不同時刻模擬的高積云,挑選了三個比較有代表性的時刻:圖3(a)正午、圖3(b)傍晚和圖3(c)夜間,三個時刻模擬的是同一種云,每個時刻有不同的太陽位置,所以光線的方向各不相同,光線的顏色也不相同.正午太陽在最高點云的表現(xiàn)較為通透;傍晚太陽在側(cè)面云的表現(xiàn)為銀邊效果;夜間月亮光線不足時,能夠清晰的觀察到云的輪廓,月亮下的云具有銀邊效果.本文可以較好的模擬出不同時刻光照條件下的云.
圖2 不同種類的云Fig.2 Different kinds of clouds
表2為圖2與圖3中各個場景的平均幀率,可以看出各場景均可達(dá)到60FPS以上,所以本文的方法可以做到大規(guī)模場景體積云的實時模擬.
圖3 不同時刻的云Fig.3 Clouds at different moments
圖4為本文方法模擬的云與云的照片的比較,圖4(a)為本文模擬的效果,圖4(b)為真實的照片,可以看出本文的模擬效果在近處可以達(dá)到與真實照片近似的效果,由于需要保證實時性,在視點的遠(yuǎn)端不進(jìn)行過多的渲染.
表2 各場景幀率
Table 2 Frame rate of each scene
場景積云高積云層積云正午傍晚夜間幀率134125148134136136
圖4 與真實的云對比Fig.4 Compare with real clouds
圖5為使用Perlin噪聲生成的云與本文方法生成的云的對比,圖5(a)為使用Perlin噪聲的效果,圖5(b)為本文的效果,可以看出本文方法在云的邊緣細(xì)節(jié)繪制效果明顯強(qiáng)于只使用Perlin噪聲的效果.
圖6為與文獻(xiàn)[4]的效果對比,文獻(xiàn)[4]使用蒙特卡羅積分和神經(jīng)網(wǎng)絡(luò)的方法,通過對已有的十多個云樣本學(xué)習(xí)后再進(jìn)行云模擬.圖6(a)為文獻(xiàn)[4]渲染34小時的效果,圖6(b)為本文場景中一朵云的效果,文獻(xiàn)[4]的云效果非常好,但是需要先預(yù)先學(xué)習(xí)多個樣本,而且需要長時間渲染,無法達(dá)到實時,本文的云在層次細(xì)節(jié)與光照上無法達(dá)到文獻(xiàn)[4]的效果,但有利于游戲等虛擬場景中進(jìn)行大規(guī)模實時繪制.
圖5 與Perlin噪聲的云對比Fig.5 Compare with Perlin noise clouds
圖6 與文獻(xiàn)[4]對比Fig.6 Compare with the literature [4]
圖7為與文獻(xiàn)[5]的效果對比,文獻(xiàn)[5]使用拉格朗日模型與體積噪聲相結(jié)合的混合物理方法,能基于物理控制云的生成,但是在云的分布和細(xì)節(jié)上較差.圖7(a)是文獻(xiàn)[5]在圓球中大規(guī)模體積云模擬的效果,圖7(b)是本文的效果,在云的分布上本文效果更加自然,云的形狀效果更優(yōu).
圖7 與文獻(xiàn)[5]對比Fig.7 Compare with the literature [5]
圖8為與文獻(xiàn)[6]的效果對比,文獻(xiàn)[6]使用基于元球的方法,通過求解高斯公式減少模擬過程中元球的數(shù)量,并且使用低分辨率的Perlin噪聲為云的邊緣增加細(xì)節(jié).圖8(a)為文獻(xiàn)[6]的效果,圖8(b)為本文場景中一朵云的效果,文獻(xiàn)使用元球所以云的形態(tài)不如本文的連續(xù).
圖8 與文獻(xiàn)[6]對比Fig.8 Compare with the literature [6]
表3為不同實驗方法的幀率對比,文獻(xiàn)[4]與文獻(xiàn)[6]是小規(guī)模云模擬,大多著眼于一朵云的模擬,而文獻(xiàn)[4]由于通過深度學(xué)習(xí)進(jìn)行光照計算,計算量過大只能進(jìn)行離線渲染,渲染時間從幾分鐘到幾十小時不等,并且對計算機(jī)硬件要求極高;文獻(xiàn)[6]將多個元球組成云,云的形狀可控性強(qiáng),但視覺效果往往不夠自然,該方法可實時繪制,當(dāng)視點離云越近幀率越低;文獻(xiàn)[5]與本文為大規(guī)模云模擬,文獻(xiàn)[5]在圓球中繪制云,每個圓球繪制一朵云,當(dāng)繪制85個圓球時幀率為7,34個圓球幀率為24,14個圓球幀率為77,平衡了真實性與實時性,因為使用的是混合方法所以在視覺效果上較差;本文在空間中對云的密度采樣,以保證大規(guī)模場景中不同種類的云建模的時候不會嚴(yán)重影響實時性,通過將光照模型分解化簡大大減少計算量,同時使用多種噪聲進(jìn)行建模,保證了云的視覺效果.
表3 不同實驗方法的幀率對比
Table 3 Frame rate comparison of different experimental methods
在使用Simplex噪聲的基礎(chǔ)上引入Worley噪聲共同生成三維噪聲,從云建模的層面上增強(qiáng)了云的真實感.由于噪聲具有偽隨機(jī)性,為了建模過程中減少噪聲的生成時間,所以將所使用的噪聲進(jìn)行預(yù)生成處理以提高建模效率.同時引入了Curl噪聲增強(qiáng)了體積云細(xì)節(jié)的不規(guī)則性和翻騰效果的真實性.根據(jù)光在云中傳播的規(guī)律求解光照模型,通過大氣中的Beer-Lambert定律求解光線的透射率,HG相位函數(shù)散射光的角度分布和強(qiáng)度,并且分別計算云的頂部與底部的環(huán)境光.最后使用Raymarching進(jìn)行體積云渲染.實驗結(jié)果表明本文方法可以對多種云進(jìn)行有效的模擬,具有普適性;并且可以模擬出不同時刻光照條件下的云;并且在不同的云與不同的時刻下平均幀率均可達(dá)到60以上,能夠滿足實時性;并且模擬的云可接近真實的云.
今后的工作為以下兩個方面:
1)根據(jù)已有的圖像生成云,實現(xiàn)云生成的可控性;
2)改進(jìn)散射效果,在保證實時的前提下,對相位函數(shù)進(jìn)行改進(jìn),以獲得比HG相位函數(shù)更好的后向散射效果,從而增加云的真實性.