劉芮,張建偉,譚詩瀚
(四川大學視覺合成圖形圖像技術國防重點學科實驗室,成都610065)
自然環境復雜多變,對于自然環境的模擬一直是虛擬現實中實現的難點之一,在各自然環境的模擬中,云層的繪制最為困難,首先,云是由大氣中的水汽、凝露等經過液化形成,在天空中隨處可見,形成過程隨機,模擬困難;其次,云是沒有顏色的,由于云是由大量水滴組成,光照射進云層時會發生各種散射和吸收,最后匯成云的常見色:白色,而隨著云層加厚,云層的透射率降低,所以穿出云層的光照減少,會呈現灰色;同時云本身也有各種種類,積雨云、層云、卷云等,云層種類不同所處大氣層中的高度也不盡相同;最后,云在空中不是一層不變的,它會隨著比如風的吹動而移動,也會隨著時間早上至晚上的形狀不一顏色不一,運動軌跡難以揣測。由上可知,云層的模擬是虛擬場景模擬的一大難點。
本文的目的是研究并實現一種實時呈現逼真的云技術,在實時的場景下,快速生成大量的云層,噪音是生成隨機物體的一種方式,而云是大自然中隨機生成的物質,可二者結合,在模擬過程中,使用噪音算法建立云的模型。同時為了模擬真實的光照,使用光線行進算法對模擬的噪音云層進行采樣,累積顏色值,繪制在視線前,如此也可實現較為真實的穿云效果。
根據以上分析,對于云的模擬有三個大點,一是云的建模,二是云的光照模式,三是云層的移動。最初對于云建模的研究是平面繪制,適用于遠距離觀察,如今發展中分為了兩種主要方法,物理方法和非物理方法。
2000 年Dobashi 等人使用元胞自動機繪制云,給云添加三種屬性:濕度、是否存在云和是否云有變形,該方法是很有效的物理方法[1];2003 年Harris 等人是基于體素模型上模擬云,通過求解物理方程流體力學、熱力學、浮力和云變形的偏微分方程模擬云[2];2013 年唐勇等人通過溫度計算熱浮力模擬云,使用Navier-Stokes 方程表示云的聚散和運動[3];2017 年Duarte 和Gomes 使用SkewT/LogP 圖模擬云,只計算云的熱力學,不求解云運動的微分方程[4]。
1983 年Perlin 提出了使用Perlin 噪音模擬云[5];1985 年Gardner 等人用空心橢圓體結合紋理模擬云[6];2016 年Schneider 等人結合Worley 噪音和Perlin 噪音,使用光線步進技術在動態光照下模擬云[7];2018 年柏靖云實現了球形粒子建模云和噪音紋理建模云,并進行對比和分析[8]。
云的光照模式也是影響云層真實度的重要元素,云的外觀是由于水分子就會聚集在空氣中的微塵周圍,由此產生的水滴或冰晶將陽光散射到各個方向,所以云中存在單次散射和多次散射以及多重各向異性散射。
1982 年,Blinn 提出一個光的反射和投射的見到那模型,開始了研究云與光之間的相互作用[9];1984 年,Kajiya 等人提出了將單次散射和多次散射結合的方式模擬云的光照,進一步提升了真實度;2001 年Harris 等人提出各向異性散射,預處理這些散射,云層光照的模擬更加的有層次;2016 年Schneider 等人提出糖霜理論,云的邊緣有暗色,就像糖堆在一起,云的自陰影使大規模云層的繪制更具真實性[7]。
云在形成過程中,首先在太陽的照射下,地面加熱,然后空氣加熱,由于熱浮力,會產生上升氣流,接著會冷卻,空氣中的水蒸氣便會凝結產生云。云在發生相變時,會產生額外的浮力,云便會隨之運動,因此云的移動也是難以捉摸。通常使用Navier-Stokes 方程來描述煙和云等不可壓縮的物體運動。
Dobashi 等人提出改變現有的演化規則,將變化沿著水平面的固定方向發展,模擬云的運動,同時引入消散變量等規則,模擬云的消散[10];Miyazaki 等人考慮了云的粘度和壓力、水蒸氣擴散、熱浮力等因素的影響,利用CML 模擬云的運動。
大自然中的云都是隨機生成的,為了模擬這種效果,大多采用Perlin 噪音算法進行模擬,可用于生成地形、水和云等效果。但在圖形學的發展中,有學者提出Perlin 噪音的改進,使用單性的特性解決了Perlin 噪音的偽影問題,使其生成各種效果更加真實。二者皆是使用晶格噪音,但Simplex 噪音的優勢便是在隨著維度的增加頂點數只增加一個,所以Simplex 噪音大大降低了計算開銷。
而其中云的建模使用的是Worley 噪音,依據的是空間分割理論,在空間中,隨機防止若干的特征點,對任意輸入的一點,計算其點到所有特征點的距離,而這個距離值的最小值便是最后的噪音值,在Worley 的優化下,將算法細化為六步,第一,確定任意輸入一點所在晶胞;第二,對此晶胞生成可重復的隨機數;第三,計算此晶胞中特征點的數量;第四,隨機將30%左右的特征點輸入到晶胞中;第五,計算輸入點到其所有特征點的距離最小值;第六,查詢并計算輸入點到所在晶胞直接相鄰晶胞特征點的距離最小值,與第五種對比返回最小值,使其更加的實用。
當光照照射到物體表面時,一些會被物體表面吸收,其他的會被反射,而對于透明的物體,還會有一些會穿過透明體產生透射光。其中只有反射光和透射光可以進入眼睛,產生視覺效果,所以物體表面光照顏色是由入射光、物體材質,以及材質和光的交互規律共同決定的。由此產生Lambert 模型,Phong 模以及Blinn-Phong 模型。
當一束光從云層的一端射入,也會發生吸收、反射,由于光是無數小水滴組成,還會發生散射、折射以及透射光,就會在云的另一端射出,在經過云層內部后,光的強度會有所減弱。為模擬這種現象,可使用Beer 定律來計算光通過一種材料的衰弱,根據光學厚度計算其透射率,用在云層中,便可沿著光線累積其光學厚度。
在大氣層中,除開被吸收的光照,散射也有很多種,主要是瑞利散射,但云是由無數小水滴構成,其中存在最多的便是米氏散射,為方便計算可使用近似求解的Henyey-Greenstein 相位函數來模擬米氏散射前向散射的效果,同時計算難度對比米氏散射大大降低。
體積渲染可以計算真的光照模型,既可以提高云層模擬的真實性還可以提高其物理真實性[11]。當然體積渲染也是有很多種方法的,大多都是需要結合物體建模方法和光照模型。所以對于云這種異質介質,可以使用光線行進算法,對生成的3D 噪音進行采樣,繪制在屏幕上,其核心思想是首先有一個體紋理,然后以視點方向發射出n 條射線向外以一個采樣步長行進,當射線處在體紋理中時,每一個步長行進后計算顏色值,計算光照,最后將射線當前累積的顏色值累積,直到顏色值達到最大或光線到達云層邊界。
本文實驗使用設備是筆記本電腦,處理器Intel i5 9300H 2.40GHz,顯卡是NVIDIA GeForce GTX1650,渲染環境是Unity3D 2019。
由以上理論結合,在場景中創建一個繪制云的長方體區域,使用Simplex 噪音算法生成一張噪音圖以顯示有無云區域,再采樣Worley 噪音算法生成132×132×132 的3D 噪音圖,其中RGBA 四個通道是不同頻率的Worley 噪音,如圖1 所示。

圖1 132×132×132 3D噪音圖
再從視點射出的射線判斷與長方體的距離,計算是否處于區域內,在區域內可直接根據步長采樣,不在區域內便求取與長方體的交點再根據步長采樣,采樣時為了模擬云層在自然中的自然生成和消散過程,在場景加載后隨著時間改變采樣值。最后在Ray-marching 算法采樣過程中計算beer 定律和HG 相位函數模擬光照,累積獲取最終顏色值,繪制在屏幕上,如圖2所示。

圖2 只有一張3D噪音繪制的云層
如此繪制出的云層邊緣圓滑,而真實的云邊緣會四散開來,于是再使用Worley 噪音算法生成64×64×64的3D 噪音圖,RGB 三個通道是不同頻率的Worley 噪音,如圖3 所示,在采樣132×132×132 的3D 噪音時減去64×64×64 的3D 噪音使生成的云層邊緣四散,更加真實,如圖4 所示。

圖3 64×64×64 3D噪音圖

圖4 兩張3D噪音繪制的云層
本文的目的是研究并實現一種實時呈現逼真的云技術,使用一張2D 噪音預計算云會出現得位置,再對3D 噪音采樣累積顏色值進行云建模,然后使用raymarching 算法繪制真實的體積云,最后云的光照模型采用Mie 散射、HG 相位函數在ray-marching 算法中累積呈現。
在繪制云層上使用噪音生成隨機物質的技術雖較為成熟,但是在云的光照模擬和云層在大氣層的分布上存在不少還沒有解決的問題,光照使用的都是類似函數,如果能計算米氏散射,云的真實性將更進一步提升,云在大氣層中的分布除了高低區分還有形狀區分,全都實時繪制也是一大難點,這些都還需要進一步的研究與探討。