龔昱寧,張嚴辭,,陳學超,聶 宇
(1.四川大學 軟件學院,成都 610207;2.四川大學 視覺合成圖形圖像技術(shù)國家重點學科實驗室,成都 610065)
大氣渲染中的云層渲染,對于可交互應(yīng)用的真實感以及飛行模擬中身臨其境效果都有著重要的意義。近幾年,實時動態(tài)云層模擬的性能以及真實感成為了一個討論熱題。在CryTek工作室[1]對云霧進行數(shù)學建模的分析后,近幾年許多廠商據(jù)此提出了他們對于體積云以及體積霧的解決方案,諸如基于點云[2-3]、天氣貼圖[4-7]或者頂點網(wǎng)格[7]的形體建模方式,體素渲染[7]或光線邁進[5-7]的渲染方式以及基于物理的體渲染光照模型[8-9]。體素渲染雖然可以提供更為準確的結(jié)果,但是其開銷較大;光線邁進(raymarching)實現(xiàn)簡單,且渲染效率與體素渲染相比較高,且對于為遠景云層而言,并不需要體素渲染這樣準確的結(jié)果。在Rockstar Games的云霧實現(xiàn)中[7],對近處霧渲染使用了體素渲染,遠處云層渲染使用了光線邁進渲染。
地平線制作組[4]對湍流模擬的解決方案中,他們使用世界坐標的線性偏移,與卷曲紋理和細節(jié)紋理采樣來模擬這樣一種湍流效果。但這種方法的效果與細節(jié)不足夠優(yōu)秀。對于云層加速渲染,現(xiàn)有的技術(shù)有通過時空重投影降低單幀渲染分辨率、藍噪聲偏移與時空降噪[10]等,但即使應(yīng)用了這些算法,云層渲染性能依舊不足夠高。
針對上述問題,本文分別在建模和渲染方面做出一些改進。其中,在建模方面,為了讓動態(tài)云層表現(xiàn)出有更加豐富細節(jié)的湍流效果,本文提出了一種通過對反Worley噪聲進行域扭曲的算法,比地平線制作組提出的湍流效果,有著更真實且有更加豐富細節(jié)的效果,且這種方法可以很容易地整合進現(xiàn)有云層渲染算法中。在渲染提速方面,本文提出了一種使用貝爾矩陣的作為光線邁進偏移量的提高性能的算法,能有效降低達到光線邁進需要達到較好效果的邁進步數(shù),以此提高性能。且這種添加偏移量的方法,可以很好地與藍噪聲(blue noise)、時空重投影降低單幀渲染分辨率等方法進行結(jié)合,再進一步提高渲染效率。
為了模擬更加真實的天空,讓3D程序使用者有更好的體驗。對于自由度不高或沒有寫實性質(zhì)要求的應(yīng)用中往往采用簡單的天空盒[11]或廣告牌[12]實現(xiàn)。然而這種實現(xiàn)方式存在無法較好地表達出云層的流動效果、非真實感及走樣性強烈等大量問題。除此之外,也有使用頂點網(wǎng)絡(luò)與噪聲偏移來渲染云層[13],此方法開銷較小,但是無法表現(xiàn)出云層的動態(tài)流動效果,且每一片云都要人工放置,大幅度提升了工作量以及顯存占用存儲空間。
基于以上提到的幾點局限性,許多研究者開始探索動態(tài)、開銷小且真實的云層渲染方式。近幾年,動態(tài)云層的模擬在形狀建模與渲染上都有著較好發(fā)展。
形狀建模是指,用一種符合真實云形狀的數(shù)學建模,表征云層的密度分布情況。需要注意的是,這樣一種建模必須滿足可以并行,快速地查找任意一點的密度值,且有著連續(xù)而非離散的密度分布,以滿足實時渲染的需求。并且使用者(如游戲制作中的美術(shù)人員)可以根據(jù)自己所想快速建模出想要的云層類型以及分布情況?,F(xiàn)有的云層形狀建 模 方 式 有 點 云[2-3]和 天 氣 貼 圖 建 模[5-7]2種。
點云可以很好地模擬云層因為溫度以及風向的動態(tài)變化,其核心思想是把每朵云看成一個單位,然后計算這個單位根據(jù)溫度、濕度、風向等參數(shù)以及每朵云之間相互影響帶來的變化。也有人提出基于熱力學的建模方式[2],但是這種建模方式實時更新所需開銷較大,且存在每一次參數(shù)改變,GPU CPU都需要較多數(shù)據(jù)交互的問題,難以滿足實時渲染可交互應(yīng)用中的渲染需求。
2015年,地平線游戲制作組[4]提供的解決方案中使用了天氣貼圖建模的方式來建模。這種方法首先使用分布貼圖與高度貼圖,作為云層在不同高度與位置的密度分布情況,然后使用一張可平鋪的Perlin Worley噪聲紋理添加細節(jié)。雖然這樣一種建模方式無法模擬溫度、風向等參數(shù)的改變所產(chǎn)生的基于物理的變化,但可以通過噪聲模擬流動效果。并且所需消耗相比點云低許多,并且美術(shù)人員可以簡單的地通過繪制天氣紋理得到他們需要的云層形狀與分布。這種方法已經(jīng)使用在許多實時渲染的可交互應(yīng)用中[4-6]。
這樣的模型進行渲染一般通過光線邁進來實現(xiàn)。光線邁進是光線追蹤技術(shù)的一種變體,適用于一些特殊的情況,比如渲染有向距離場定義的物體或有體積等半透明的物體時。云層渲染即屬于這樣一種有體積的半透明物體。云層渲染中,根據(jù)CryTek工作室[1]提出的模型,在光線邁進的每一步都需要根據(jù)當前位置的密度,計算從視點到該位置累計光照值與累計削減度,本文通過朗伯比爾定律(Beer’s Law)來確定削減值。此外還需要計算光源發(fā)射出來的光線經(jīng)過該點散射進觀測方向的輻照度,本文往往通過相位函數(shù)(phase function)來確定這個比例,根據(jù)介質(zhì)的不同,本文往往采取不同的相位函數(shù)模型,正如寒霜引擎技術(shù)分享[6]中所述,云的相位函數(shù)十分復雜,在實時渲染中,通常使用基于天文學[14]啟發(fā)的Henyey Greenstein模型,這幾年對此提出的改進,有基于經(jīng)驗?zāi)P偷纳疤切Ч?5];與全局光照類似,某點折射向視點的輻照度不僅來源于光源的直接散射,同時也會受到其他部分散射到該點的光強度的影響,考慮到這些情況的復雜模型,若要求出準確的解,需要大量的計算量。因此有研究者提出了基于多次迭代的近似公式[8]。基于以上物理模型,便可以得到基于物理較為準確的渲染結(jié)果。
云層的實時湍流模擬可以增加云層流動時的動態(tài)細節(jié),給整體畫面帶來更強的真實感。但對其研究較少,近幾年只有地平線制作組[4-5]提出了他們的解決方案。地平線游戲制作組對湍流的模擬中,首先讓世界坐標隨時間累計緩慢上升,模擬一種云層在向上流動的效果。之后使用卷曲紋理對世界坐標左右偏移營造出一種來回抖動的效果,再將新的世界坐標進行比例縮放,處理為紋理坐標,對一張3D細節(jié)紋理坐標進行采樣,再將密度采樣結(jié)果與之前紋理貼圖建模過程中得到的結(jié)果進行一定運算方式的疊加,得到最終的密度。
域扭曲是計算機圖形學中一種用來產(chǎn)生過程性紋理或者模型的常見技術(shù)。這種方法對一個可以過程性產(chǎn)生連續(xù)分布的密度空間或者幾何形狀的輸入進行扭曲,以得到一些期望的結(jié)果,藝術(shù)家們常用這種技術(shù)做出有藝術(shù)感的噪聲效果,現(xiàn)在也被用來做虛擬視景生成[16]。
貝爾矩陣是一種用來有序抖動的算法,最早是在印刷刊物時被用來表示不同透明度的一種技術(shù)。圖形學中現(xiàn)在也被用來讓物體變得透明等,也有使用這種技術(shù)來做圖像降噪[17]。
在一些體積光渲染[18-19]中,貝爾矩陣被用來提升光線邁進中體積光渲染的效率。云層渲染的效率和光線邁進的步數(shù)直接相關(guān),因此如果能減少步數(shù),便可以大幅度提高效率。受此啟發(fā),本文在云渲染中使用貝爾矩陣來減少步數(shù),提升渲染效率,發(fā)現(xiàn)其效果優(yōu)秀、性能提升較高。
本文對云層渲染的實現(xiàn)中,流程上與地平線游戲制作組[4]提出的流程一致。對于更加豐富細節(jié)的湍流效果,本文在建模上進行了些許更改;對于貝爾矩陣提升效率的部分,本文在渲染部分提出了更改,并且應(yīng)用了時空重投影[7,18](Temporal reprojection)。建模上,本文采用了一種基于可控域扭曲的建模方式,替代了地平線游戲制作組為模擬湍流效果而使用的卷曲噪聲。
雖然地平線制作組的湍流模擬算法可以模擬出云層在流動時的湍流效果,但這樣的解決方案存在不足。首先,這樣的偏移方式在云層較快流動時會帶來些許重復性的人造感;其次,云層發(fā)生變化的部位較小,無法讓云層整體因為像現(xiàn)實中因湍流等發(fā)生較大的形體變化;最后,因使用了卷曲噪聲與細節(jié)噪聲對云體邊緣進行偏移,流動方向上的邊緣缺乏連續(xù)性,會突然出現(xiàn)或者消失一小部分云。雖然可以通過增大紋理尺寸來減少重復性人造感問題,但另外2個問題無法解決,且這樣的彌補做法會占用更多的額外顯存空間,且會降低緩存命中率。
然而,使用域扭曲,在參數(shù)合理情況下則可以很好規(guī)避以上問題。域扭曲這種在噪聲基礎(chǔ)上再疊加噪聲的性質(zhì),可大幅度提升隨機序列的長度,減少了重復性。其次,在對云層整體形狀建模時,應(yīng)用了域扭曲,而非像地平線制作組在整體形狀建模后用噪聲進行偏移,本文做法可以讓不止只是邊緣細節(jié)發(fā)生更改,整體云的形狀也會發(fā)生變化,且變化會更加有連續(xù)性,不會有一部分云突然消失或者出現(xiàn)。
域扭曲使用到的布朗分形運動的疊加方式具有高度的自相似性,這也與湍流有著一定的自相似性符合。相比原方法,僅僅多了3次紋理采樣,且由于利用了GPU的高速緩存以及線程掛起機制[9],性能幾乎沒有降低,且不需要一張額外的卷曲紋理,降低了內(nèi)存消耗。本文對傳統(tǒng)域扭曲進行了些許更改,讓其變得更加可控,使得其能根據(jù)風向表現(xiàn)出更加符合風向流動的特點。結(jié)果上,與地平線游戲制作組相比,本文改進后的湍流模擬效果所需內(nèi)存小且效果更加符合真實效果。整個流程如下:
步驟1 首先將深度緩存進行降采樣以滿足時空重投影的需要。并根據(jù)深度緩存,當前視點位置與預(yù)先設(shè)定的最大邁進步數(shù)計算光線邁進的步長。
步驟2 使用本文中的貝爾矩陣與藍噪聲等方式對邁進步長進行偏移。
步驟3 開始邁進,使用本文中帶有湍流效果的密度模型進行采樣,并在每一步上計算累計的光照值與累積的削減值。
步驟4 判斷是否達到邁進終點。若未到達終點則繼續(xù)邁進,若到達終點則結(jié)束邁進,繼續(xù)下一步。
步驟5 將最后的結(jié)果進行時間重投影,并與場景渲染的結(jié)果進行混合。最后便得到最終的渲染結(jié)果。
湍流是一種較為復雜的物理現(xiàn)象,科學家至今為止也無法準確地對湍流進行建模來預(yù)測湍流的運動軌跡。不同的噪聲可以塑造出不同形狀與種類的云[20],但單純的一種噪聲很難與另一種噪聲簡單疊加,模擬出云層流動連續(xù)的動感。若使用的噪聲無法表現(xiàn)出云層連續(xù)的動感,則會造成很強的人造感。因此本文希望找到一種能近似表現(xiàn)連續(xù)流動的特殊噪聲,用一種能隨時間發(fā)生連續(xù)變化的特殊噪聲來給云層添加細節(jié)。
根據(jù)Kolmogorov等[21]的理論,湍流在統(tǒng)計上不同比例下有自相似性。布朗分形運動噪聲[22]作為一種常被用來模擬自然場景的噪聲,由于其構(gòu)成上是由同一個噪聲的不同頻率進行疊加,因此在統(tǒng)計上不同比例下也有較強的自相似性。但僅僅使用布朗分形運動來模擬云層的湍流,無法模擬云層局部連續(xù)的動態(tài)。這是由于布朗分形運動的疊加過程是多個噪聲進行疊加,這樣一種求和計算方式無法加入一個時間維度,讓噪聲發(fā)生像觀測到的湍流一樣發(fā)生局部的連續(xù)變化。而域扭曲可以讓經(jīng)過其變化的信號在一個新維度上發(fā)生連續(xù)的變化,這符合本算法的需求。
云層渲染建模需要使用Worley噪聲與Perlin Worley噪聲等2種噪聲。本文分別對2種噪聲進行布朗分形運動疊加后再進行域扭曲,結(jié)果如圖1與圖2所示(為了方便觀察,在亮度上進行了非線性縮放)。本文將得到結(jié)果與使用染料在流體中觀測到湍流進了對比[23],如圖3所示。
圖1 域扭曲反Worley噪聲效果圖
圖2 域扭曲Perlin Worley噪聲效果圖
圖3 通過染料在流體中觀測到湍流效果圖
本文發(fā)現(xiàn)使用了布朗分形運動的反Worley噪聲(圖1)進行域扭曲的結(jié)果,與在空氣中觀察到的湍流的形體具有相似性,都有旋渦且保持旋轉(zhuǎn),局部發(fā)生著持續(xù)變化,而部分與部分之間的關(guān)系發(fā)生的變化不大,且反Worley噪聲在建模中擔任了添加細節(jié)的作用,讓渲染出的云有著“西藍花”狀,因此在實現(xiàn)上對其隨著時間變化的幅度限制較低。
Perlin Worley噪聲得到結(jié)果也與觀察結(jié)果有部分相似性,但其整體的變化過大,并且Perlin Worley在云層模型建模中擔任著表達云朵與云朵間位置的骨架作用,經(jīng)過域扭曲的變化會讓云朵有隨機搖擺的效果而顯得不真實。但為了讓云的整體形態(tài)隨著時間有一定的變化,在算法實現(xiàn)上使用了一定參數(shù),控制其變化范圍。
一維布朗分形運動的域扭曲的通用公式為:
布朗分形運動的域扭曲是一個反復迭代的過程,上面通用公式中offsetn表示第n次迭代時的偏移值,an表示第n次迭代時頻率發(fā)生的變化。多維布朗分形運動的域扭曲可以由這個公式進行拓展,在每次迭代的時候用上一次的結(jié)果(多維),將這個多維結(jié)果用不同布朗分形噪聲(或者一個布朗分形噪聲針對每一維進行一些偏移)進行采樣,產(chǎn)生多維結(jié)果,再將這個結(jié)果傳入下一次迭代。最后若要獲取一個標量,便可以由最后一次結(jié)果對一個布朗分形噪聲進行采樣以獲取單個標量的結(jié)果。
受此啟發(fā),本文對地平線游戲制作組[4]中的建模進行了更改。
原算法為:首先用經(jīng)過的時間乘以一個期望的變化頻率,再乘以向上方向單位向量,再加到采樣點的世界坐標位置上,以此來進行一定的偏移;其次,根據(jù)得到的坐標對Worley Perlin噪聲、反Worley噪聲與形狀建模貼圖進行采樣,再使用了一種特定的方式對2個噪聲的采樣結(jié)果進行疊加。之后再使用卷曲噪聲對世界坐標進行進一步的偏移,再用這個坐標對一個細節(jié)Worley噪聲進行采樣;最后將這個結(jié)果與之前的結(jié)果用一種特定的方式進行疊加。
本文的改變是:首先去掉了向上偏移,因為將世界坐標向上偏移的目的是通過讓描繪云層細節(jié)的噪聲向上浮動來模擬云層內(nèi)部的動態(tài)變化,這種近似方法十分不準確,會帶來較強的人造感效果。且若保留,會將這種人造感效果帶到本文算法的實現(xiàn)中,會降低本算法的渲染質(zhì)量。并且本文的算法已讓云層有較為豐富的動態(tài),不再需要這樣一種簡易處理方式來增加云層的動態(tài)。本文對原算法的改進如下:
算法1 基于域扭曲的可控湍流建模。
輸入:當前點的世界坐標WorldPos
根據(jù)風向計算風向的單位向量WindDir
湍流振幅TurbulenceScale
湍流抖動的范圍DisplacementScale
抖動頻率Frequency
云層上下流動幅度UpandDownScale
控制整體形變大小的Displacement
FormSize
輸出:當前點的密度采樣結(jié)果ResultDensity
//計算域扭曲所需偏移量
三維用來存儲湍流迭代信息的向量q;
q.x=SampleFBMofWorley(WorldPos+Wind Dir.x Frequency) WindDir.x;
q.y=SampleFBMofWorley(WorldPos+Upand DownScale Frequency) UpandDownScale;
q.z=SampleFBMofWorley(WorldPos+Wind Dir.z Frequency) WindDir.z;
//根據(jù)域扭曲對紋理噪聲進行采樣
DMWResult=SampleFBMofWorley(WorldPos+q TurbulenceScale);
DMPWResult=SampleFBMofPerlinWorley(World Pos+q TurbulenceScale);
OriWResult=SampleFBMofWorley(WorldPos+q TurbulenceScale);
OriPWResult=SampleFBMofPerlinWorley(WorldPos+q TurbulenceScale);
//對域扭曲表現(xiàn)出來的幅度加以控制
FinWResult=lerp(OriWResult,DMWResult,Dis placementScale);
FinPWResult=lerp(OriPWResult,DMPWResult,DisplacementFormSize)
//進行混合
ResultDensity=RemapClamped(FinWResult,-0.3f FinPWResult,1.0,0.0,1.0)。
第1部分,為了實現(xiàn)較為可控的域扭曲,本文對每個分量進行域扭曲計算時,用風向WindDir以及用戶指定的上下流動幅度UpandDownScale、振幅TurbulenceScale、頻率Frequency進行了限制。這些參數(shù)除了設(shè)定成標量以外,也可以像天氣紋理一樣由紋理獲得,以得到更加精致的結(jié)果。通過這樣的設(shè)置,本文可以得到更加可控的域扭曲結(jié)果,會對后面產(chǎn)生的動態(tài)效果帶來極為重要的影響。最后得到了本文經(jīng)過域扭曲后的紋理坐標(WorldPos+q TurScale)。
第2部分,本文對沒有經(jīng)過域扭曲與經(jīng)過域扭曲的反Worley噪聲、Perlin Worley噪聲分別進行了采樣。
第3部分,本文對2次反Worley噪聲的采樣結(jié)果(DMWyResult,OriWResult)進行混合,用一個參數(shù)DisplacementScale來控制從原結(jié)果到域扭曲的結(jié)果的變化比例,從另外一個角度限制域扭曲,確保了結(jié)果的準確。同樣的操作,也對Perlin Worley噪聲采樣時使用(DMPWResult,OriPWRe sult),用DisplacementFormSize控制扭曲比例。
第4部分,本文應(yīng)用了地平線游戲制作組[4]將2種噪聲進行疊加的方式,獲得了最后的結(jié)果
ResultDensity。
本文去掉了對卷曲噪聲取樣這一步,但保留了使用細節(jié)紋理,為最后云層整體添加細節(jié)。
通過多個參數(shù)的控制,本文對域扭曲這種隨機過程進行了控制,使得最終結(jié)果更加可控。
云層渲染由光線邁進實現(xiàn)。近幾年來有許多方法來提高效率,一定程度緩解了云層渲染需要的光線邁進所帶來的較大開銷。本文提出的貝爾矩陣的性能優(yōu)化,可以進一步通過減少邁進步數(shù),并且可以與近幾年提出的藍噪聲[7]以及重投影等方式相互結(jié)合,進一步提升效率。
貝爾矩陣的公式為:
貝爾矩陣是一個迭代的過程,M2n代表第n次迭代得到的2n2n大小的矩陣,對于高階的矩陣(n>2),每一個矩陣都可以由這個公式迭代得到。
在云層渲染中,由于相近像素點之間的密度存在一定的相似性,為了利用領(lǐng)域的相似性,若使用高斯模糊等方式進行卷積的操作,會大大降低細節(jié)的豐富度。光線邁進從起點開始,向前連續(xù)邁進相同的單位步長進行采樣,若起點向前偏移一定的單位步長(0~1之間)再進行采樣,將多次采樣的結(jié)果進行取均值,便可以得到更加貼近準確的值,這樣的方式可以類比于用蒙特卡洛算法,但是需要大量的計算量,時空重投影中就是采用了這樣一個特性,并利用低差異序列以及藍噪聲進行偏移,將多次的結(jié)果累計,進而得到更加精確的值。
基于貝爾矩陣的優(yōu)化受到上面兩者的啟發(fā),通過把整體渲染紋理分為多個4×4的部分(本文使用了4×4的貝爾矩陣),在光線邁進的起點,用該點對應(yīng)這個4×4矩陣所在位置的值與單位步長的乘積作為起點向前的偏移量,再進行光線邁進。因為相近的邁進結(jié)果會有相似的結(jié)果,通過貝爾矩陣這樣一種視覺欺騙方式,通過周圍的結(jié)果累計了自己不同初始偏移量的近似值。并且不會像高斯模糊一樣產(chǎn)生過于模糊或產(chǎn)生出現(xiàn)“一層一層”的結(jié)果。
本文使用的4×4貝爾矩陣如下:
作為結(jié)果,即使較少的采樣數(shù)情況,也可以得到很好地效果。
本次實驗使用了3 840 2 160的渲染分辨率與GTX2080的顯卡。為了很好地整合進現(xiàn)有的渲染管線,本文在Unity3D(2019.2.15f1)上進行了實驗。
為表現(xiàn)該論文湍流效果的先進性,本節(jié)將具有本文實現(xiàn)帶有湍流效果的云與2015年地平線游戲制作組技術(shù)分享[4]中提到的帶有湍流效果的云進行了對比。其中域扭曲組是本文實現(xiàn)的算法。而原實現(xiàn)組是地平線制作組在技術(shù)分享上提到的算法,其核心是用一張卷曲噪聲貼圖對世界坐標進行偏移來模擬流動的效果。本文分別從云層上方以及下方進行了對比,并采用了1幀/s方式記錄云的變化,然后用序列幀的方式拼接在下方。為方便觀察,在本部分修改了光照渲染的系數(shù),使得云層的邊緣更易于觀察。從上方觀測時,域扭曲組和原實現(xiàn)組的效果圖分別圖4和圖5所示。
圖4 從上方觀測時域扭曲組效果圖
圖5 從上方觀測時原實現(xiàn)組效果圖
整體上,按照本文方法,渲染出的云具有更豐富的扭動細節(jié),并且運動模式像湍流一樣有著自相似性,云層整體也發(fā)生些許形態(tài)變化。而對比組的動態(tài)幅度較低,在近處觀測時會出現(xiàn)明顯的人造感。
從上方觀測云時,本文使用域扭曲組進行了位置的固定,以更加方便觀察。而原來的實現(xiàn),因算法的需求要在流動時才能產(chǎn)生湍流效果,因此隨著時間變化,存在著向屏幕方向的流動。通過對比,域扭曲組對云層整體形狀以及周圍細節(jié)皆存在著持續(xù)性的變化,而原方法只在云層邊緣發(fā)生著些許的擾動,形狀變化相對于本文的實現(xiàn)較為生硬。從下方觀測時,域扭曲組和原實現(xiàn)組的效果圖分別圖6和圖7所示。
圖6 從下方觀測時域扭曲組效果圖
圖7 從下方觀測時原實現(xiàn)組效果圖
在從下方觀測云層底部時,可以發(fā)現(xiàn)帶有湍流建模組云層內(nèi)部以及整體發(fā)生著些許的形狀變化,并且在云層邊緣有著更加豐富的上下流動效果,給云層流動帶了更加豐富的細節(jié)與真實感。而原實現(xiàn)組只有處于外側(cè)的云發(fā)生了形態(tài)上的變化,云層整體發(fā)生變化較小,整體的動態(tài)相對于本文的實現(xiàn)較為生硬。
為表現(xiàn)本文使用貝爾矩陣對效率提升的先進性,本文與SIGGRAPH2019 Rockstar Games[7]技術(shù)分享中提出的藍噪聲的加速渲染效率進行了對比。
本文在應(yīng)用時空重投影與降低分辨率渲染的基礎(chǔ)上,將“不應(yīng)用藍噪聲與貝爾矩陣”、“只用藍噪聲[7](即對比論文中的算法)”、“與用貝爾矩陣與藍噪聲(本文實現(xiàn)算法)”這三者在不同邁進數(shù)下得到的結(jié)果進行了對比。邁進數(shù)是指,將從視點發(fā)射的射線跟云層相交最高處與最低處的2個交點所連成的線段分為多少份來進行采樣。越高的邁進數(shù)意味著采樣間距越小,得到的結(jié)果也更為準確。
雨云由于密度相比于層云更高,因此在邁進累計上更容易出現(xiàn)因為光照衰減值達到閾值而使得算法提前結(jié)束,這樣的情況會讓算法整體運行更快。為表達本算法在多種情況下都有其先進性,本部分別在雨云與層云情況下,對不同邁進步數(shù)得到的結(jié)果進行對比與分析。
在層云情況下,實驗結(jié)果如圖8~10所示。每一組中,從左到右、從上到下,依次為邁進數(shù)8,16,24,32,48,64。
圖8 層云下不應(yīng)用藍噪聲與貝爾矩陣效果圖
圖9 層云下只應(yīng)用藍噪聲效果圖
圖10 層云下應(yīng)用藍噪聲與貝爾矩陣效果圖
圖11 為不使用藍噪聲與貝爾矩陣,使用128步邁進數(shù)時達到的收斂效果,以其效果作為對照組,對照組中用紅色標出來的部分為每一組實驗組中截取的部分。表1為各個組在不同步數(shù)下渲染每一幀所需的時間。
圖11 層云下對照組效果圖
表1 層云下不同算法在層云渲染所需時間 ms
其中,第1組在48步及其以上時不再出現(xiàn)“分層”問題與細節(jié)缺失問題,64步及其以上時才不會存在畫面抖動現(xiàn)象。第2組在32步及其以上時不存在“分層”問題與細節(jié)缺失問題,48步及其以上時不再存在畫面抖動問題。第3組即使在8步時也不存在“分層”問題,但8步時存在細節(jié)丟失問題,第16步及其以上不再存在抖動與細節(jié)丟失問題。由此可見,第1組需要達到跟對照組近似的效果需要的渲染步數(shù)是64步,每一幀需要17.0 ms的渲染時間。作為對比算法的第2組,達到近似的效果需要48步,即每一幀需要13.6 ms的渲染時間。本文算法的第3組達到近似效果需要16步,即每幀需要7.0 ms的渲染時間。本文算法相比第一組性能提升了58.8%,相比第二組的對比實驗提升了48.5%。
在積云情況下,實驗結(jié)果如圖12~14所示。每組中,與步數(shù)對應(yīng)的關(guān)系與前文一致。圖15為渲染效果的對照組。對照組中用紅色標出來的部分為每組實驗組中截取的部分。表2為各個組在不同步數(shù)下渲染每幀所需的時間。
圖12 積云下不應(yīng)用藍噪聲與貝爾矩陣效果圖
圖13 積云下只應(yīng)用藍噪聲效果圖
圖14 積云下應(yīng)用藍噪聲與貝爾矩陣效果圖
圖15 積云下對照組效果圖
表2 積云下不同算法在層云渲染所需時間 ms
其中,第一組在64步及其以上時不再出現(xiàn)“分層”問題,64步及其以上時才不會存在畫面抖動與細節(jié)確實現(xiàn)象。第2組在48步及其以上時不存在“分層”問題與細節(jié)缺失問題,64步及其以上時不再存在畫面抖動問題。第3組即使在8步時也不存在“分層”問題,第16步及其以上也不再存在抖動問題,但16步時存在細節(jié)缺失的問題,24步及其以上時不再存在細節(jié)缺失的問題。由此可見,第1組需要達到跟對照組近似的效果,需要的渲染步數(shù)是64步,每幀需要11.8 ms的渲染時間。作為對比算法的第2組達到近似的效果需要64步,即每幀需要11.8 ms的渲染時間。本文算法的第3組達到近似的效果需要24步,即每幀需要6.5 ms的渲染時間。相比于第1組與第2組,本文算法性能上提升了44.9%。
在邁進數(shù)較低時,雖然本文算法渲染每一幀所消費時間偏多一些,但是能帶來更好的效果??傮w上,本文算法能用較低邁進數(shù)得到另外兩組需用較高邁進數(shù)才能得到的效果。相對于Rock star Games[7]中提出的方法,本文算法有著45%左右性能的提升。
提出了使用域扭曲對云層進行建模,給流動云層帶來了更多的湍流細節(jié)。且將貝爾矩陣應(yīng)用到了云層渲染上,對光線邁進的起始點進行偏移,大幅度減少了達到較好效果所需的邁進數(shù)。實驗表明,本文算法給動態(tài)云層帶來更加豐富的湍流效果,讓云層的動態(tài)更加真實與豐富。同時,提升了云層渲染的性能。后續(xù)將考慮把這種建模方法應(yīng)用在霧以及體積光上,給這2種體渲染帶來更加豐富的細節(jié)。