[Unity][翻譯]云朵Shader步驟分解

人工翻譯自Alexandre Stroukoff的文章《CLOUDS SHADER BREAKDOWN》,原文鏈接:http://astroukoff.blogspot.com/2019/09/clouds-shader-breakdown.html

在正文之前,先說下作者的制作過程,大致分為三步:

  1. Houdini中創(chuàng)建云朵網(wǎng)格,通過“clouds”節(jié)點(diǎn)創(chuàng)建粗糙的云朵形狀,生成低面數(shù)網(wǎng)格,并平滑法線。
  2. 導(dǎo)入3ds Max,烘焙天光與平行光到頂點(diǎn)色,然后模糊。
  3. 導(dǎo)入Unity,頂部加上滾動的云朵紋理與更多細(xì)節(jié)。

從作者的介紹來看,第一步目的是創(chuàng)建云朵模型,第二步目的是烘焙光照,理論上也可以用別的軟件來做,并且提前烘焙光照意味著云朵在引擎中是靜態(tài)不受光照的,這點(diǎn)需要注意,文章末尾也有關(guān)于動態(tài)光照的說明。

前兩步作者只是簡單介紹了一下,并且視頻很糊,就不貼了,以下是正片,文章中的引用段是我的注釋。

正片

原文:http://astroukoff.blogspot.com/2019/09/clouds-shader-breakdown.html
作者:Alexandre Stroukoff

我根據(jù)ThatGameCompany的游戲《Sky 光遇》制作了一個云朵Shader,本篇文章是關(guān)于它的一個小小的步驟分解。

效果中作用最大的是云朵Mesh本身,其次是烘焙光照,我使用Houdini + 3ds Max來生成它們。在這篇文章中我僅注重于介紹Shader部分,Shader使用Amplify Shader Editor(ASE)制作。

第一步連接Vertex Color(頂點(diǎn)色)到Emission(自發(fā)光),為了顯示先前(在3ds Max中)烘焙的光照,我使用了一個0.454545的指數(shù)來校正頂點(diǎn)色(因?yàn)閟RGB/Linear/Gamma叭啦叭啦)。

這里的0.454545冪運(yùn)算將Vertex Color從線性空間變換到了Gamma0.45空間(sRGB),作者的工程設(shè)置中顏色空間為Gamma,這種情況下Unity不會幫我們做這個校正,所以需要手動做一下,如果你的顏色空間是Linear就不需要了。

大量的三角面能帶來更絲滑的移位效果,如果性能上吃得消,Tesselation(曲面細(xì)分)是個好辦法,在左側(cè)面板勾上“tesselation”選項,選擇distance based模式。

調(diào)整距離與tesselation參數(shù)直到你和你的電腦都滿意為止,這里調(diào)一個非常近的距離就不錯。

現(xiàn)在好玩的來了,我加了一個Noise Generator(噪聲生成器),這個節(jié)點(diǎn)很方便,它可以根據(jù)世界位置生成3D噪聲。使用3D噪聲比較吃性能,你可以換成Simplex(單形噪聲),我很確定整個效果都可以用噪聲紋理和UV搞定。我用世界坐標(biāo)乘以一個浮點(diǎn)數(shù),用作噪聲節(jié)點(diǎn)的“Size”輸入,這個浮點(diǎn)數(shù)用來控制噪聲的tiling。
并且從-1/1 映射到 0/1,避免出現(xiàn)負(fù)值。
在Debug輸入中加入了這個(指上面的浮點(diǎn)數(shù))。

通過這個浮點(diǎn)數(shù)調(diào)整tiling的效果

雖然tiling一般指紋理的平鋪,但這里控制的是噪聲紋理的大小,參數(shù)的命名也是“3dNoise Size A”。

現(xiàn)在,不直接使用World Position,而是將它乘以一個Vector3("NoiseScaleA"),這樣可以對噪聲做非統(tǒng)一縮放,非常方便?。ň拖駥esh進(jìn)行縮放一樣,但你只是縮放輸入位置)。這里我沿Z軸對噪聲進(jìn)行拉伸示范一下效果。

是時候加點(diǎn)移動了,很直接,在我將縮放后的世界坐標(biāo)連接到噪聲之前,我增加一個Vector3,令時間與它相乘,這樣就可以控制噪聲移動的方向

改變噪聲方向的效果(因?yàn)槭?D噪聲,所以看起來不錯,用2D噪聲比較難做到)

現(xiàn)在將它連到Local Vertex Offset,并與兩個東西相乘:

  1. 一個范圍在0-1的浮點(diǎn)數(shù),用來調(diào)整強(qiáng)度;
  2. 一個Vector3(0,1,0),用來強(qiáng)制讓噪聲只在世界Y軸上移位,只是這樣看起來更不錯,你也可以使用Mesh的法線。
調(diào)整新的參數(shù),Speed(噪聲速度),Size(噪聲大?。琒trength(移位力度)

我決定把噪聲重復(fù)3次。復(fù)制所有參數(shù),并且把它們加在一起。這讓我想起了以前做過的一個項目(卡通火山碎屑噪聲)。思路很簡單:對于每個噪聲,將力度降低一半,雙倍tiling,雙倍速度,然后再調(diào)整!

每個噪聲之間的關(guān)系很重要,這里我只調(diào)整Strength(力度),單獨(dú)調(diào)整噪聲很容易(將除當(dāng)前噪聲外的所有力度調(diào)為0),然后調(diào)整力度。

近距離觀察噪聲是如何融合在一起的

對于漸變的邊緣,使用透明材質(zhì)和Depth Fade節(jié)點(diǎn)簡單設(shè)置。

這一部分比較取巧(hack),但它增添了許多細(xì)節(jié)。大體上來說我就是添加了一個黑白的云朵紋理,并使用Triplanar Mapping(三面映射)采樣,為了讓Triplanar Mapping動起來,我使用了來自噪聲C的修改后的世界位置(看下面的圖1),并且我讓所有東西與噪聲A相乘來“抹去”這里那里的紋理(看下面的圖2)。

圖1 來自噪聲C的世界位置
圖2 噪聲A

我使用了Register/Get Local Var節(jié)點(diǎn),避免我的連線亂得像兜里打結(jié)的耳機(jī)線,ASE的這個功能真是太棒了。

這是云朵紋理

ASE內(nèi)置了Triplanar Sampler節(jié)點(diǎn),與簡單的紋理采樣相比,Tri-Planar Mapping在模型陡峭部分較多、UV不規(guī)范的情況下很有用。

你可以看到加入云朵紋理后的效果,真系好靚!

倉庫地址: https://github.com/AlexStrook/UnlitClouds

備注:

  • 這全都是靜態(tài)的、烘焙好的(指光照),但我很確定你可以把它做成受動態(tài)光照的。你可能需要重新構(gòu)造移位所需要的法線,你可以用這些節(jié)點(diǎn):
  • 我本來還想加上Flowmap,但沒時間做了。Flowmap可以幫助控制云朵材質(zhì)平鋪的方向與噪聲的滾動。
  • 我之前看到另一個很有意思的技術(shù), 視頻鏈接(約10分鐘),他們通過微調(diào)廣告牌(billboard)位置實(shí)現(xiàn)了戰(zhàn)地1中的云朵??雌饋硐喈?dāng)不錯,但我猜他們在幕后肯定用了什么瘋狂的魔法來達(dá)到這種效果...當(dāng)然說不定你也能做到!
  • ThatGameCompany的Mike Lester說他們的做法使用了光線步進(jìn)(Raymarching) 鏈接
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容