MMD聯(lián)動Unity學習筆記 Vol.21 ShaderGraph制作讓模型隨著音樂振動

前言
????這期我們的主題還是ShaderGraph。這期的筆記內容來自官方達哥的視頻《音Game制作讓模型隨著音樂擺動的特效》,下面是視頻地址。



音樂游戲里面常看到的一個特效,讓模型隨著音樂擺動。你可以看到上圖中模型有凹凸不平的振動,并且不像平常只是一個平面,這種方法是360度的方向都會振動。
解讀Shader Graph的方法
????我們先練習閱讀Shader Graph的方法,這跟寫代碼不同,圖表隨著效果的復雜,必然越復雜,那你看到這么復雜的圖通常會減低學習的意愿。所以了解拆解并簡化這些圖是很重要的,比如說像這個PBR本身會有很多通道,3D美術過都應該很熟悉這些通道的意義,當你看到一張圖時,先確定你想要讀的方向,比如你想要了解這個著色器的振動特效是如何做得,那它一定是Position通道負責的,因為它是跟座標系相關的。同理你只是想知道發(fā)光如何處理,那只需要解讀Emission這部分的圖即可。

????通常Albedo通道和Normal通道的圖彼此會長得非常相似,因為它們處理的內容幾乎是重疊在一起的,所以這里通常你只需要讀懂一個,就可以明白另一個的邏輯。這個項目我只想要知道振動的效果是怎么做,那我可以把Emission的線斷掉。

????這樣要解讀的圖就已經整整砍了一大半了,剩下的Position圖面,Add和Multiply,加法和乘法節(jié)點,基本都是在做數(shù)值改變。

????因此全部都屏蔽掉之后,剩下的節(jié)點就不多了。Position和Time的結合就是讓座標每一幀都改變,所以這張圖里,我們沒有介紹過的, 就剩下Normal Vector和Simple Noise這兩個節(jié)點。
去查清楚這兩個節(jié)點的用法,那就大概那讀懂這張圖的作用了。讓練習還原效果,你可以把Position這條線斷掉之后,放在上面當參考,我現(xiàn)在添加一個Normal Vector的節(jié)點,它的功能就是通過法線方向做位移,添加另外一個Position節(jié)點,并嘗試用一個Add節(jié)點將它們串連起來。這里我把兩個座標系都改為Object并存檔,你就會看到整個球體都被 放大,當然這樣是全部的網格點被放大,想要讓每個節(jié)點的放大的幅度不一樣,我添加另外一個Position和Time的節(jié)點,并把它們兩個用Add節(jié)點串連起來。關于加法和乘法的差別,當座標用加法節(jié)點串連起來時,它表現(xiàn)的感覺像是在平移,因為很一個網格點加的數(shù)值都相同。如果是用節(jié)點乘法的方法串連起來的,它的表現(xiàn)的感覺好像是放大。

????基礎值大的偏移量就會越大,這里我加一個Simple Noise的節(jié)點,這是一張噪點圖。簡單來說就是拿來當亂數(shù)使用,稍后球面的振動就會依照這里的值,反映到每個網格點上的法線距離,把它連到UV就會看到圖開始流動,把另外一端連上就會看到球開始反映。

????這里(Simple Noise)的Scale默認是500,數(shù)值越小,代表它影響的網格面積就越大,調整為100,讓它看起來沒有那么尖銳。你也可以調5試試看,看起來就像個流體的感覺,還蠻酷的,挺適合拿來做一些片頭特效。先改回100,這樣就和上個結果是一樣的。 Emission的通道可以連回來了。
????接下來的思路是通過截取外部信息,進而影響球體變化強度,所以我添加一個乘法節(jié)點在Simple Noise節(jié)點之后,并且從左上角的窗口(黑板)添加一個Vector1,命名為Power。

????其中很重要的是Reference欄位,就是將作為腳本存取的變量名稱,那我改為_Power,把這個欄位拖到圖面上,并且連接剛剛新添加的乘法節(jié)點上。

????然后我在這個球上添加一個Audio Source(組件),用來發(fā)出聲音的。

????然后寫一個DisplacementControl.cs(腳本)來讀取音樂的信息。

????這個腳本的主要邏輯是這樣的,在Start()里面會去把物件的meshRender參照下來,作為以后我要改顏色信息的一個捷徑。那Update()最重要的是,audio.GetOutputData()這個函(式)數(shù),它會實時的截取音頻信息,這樣我就可以拿來解析并轉化成為一個值,來讓模型變動。
meshRender.material.SetFloat("_Power",scale,y);
這一行就是負責把最終值傳回給Power。
meshRender.material.SetColor("_Color",GetVolumeColor(scale,y));
這一行是達哥額外寫的判斷。
GetVolumeColor這個函數(shù)里面,如果值超過0.2的話,就隨機改一個顏色。并播放一個粒子特效。如果沒有超過就保持藍色,這樣就完成了。
????
????這里介紹一個小技巧,因為Shader在沒播放的時候也會動,如果你覺得這樣很惱人的話,可以在這里把它關閉。

????這樣就不會看到效果了。當然播放時還是會正常的播放。
????把這個Shader應用在其它的物件上試試看,全身都在抖動。

????改為0.1試試看,可以模擬引擎啟動的感覺,我把噪點調小一點,這樣就好像熱氣流導致的熱效應,調負的也可以很有意思的。

????通過這樣的學習來讀懂別人的Shader Graph,吸收成為自已能讀懂的圖,并延伸制作其它的特效。你可以把這些圖的代碼打開來,然后進一步的優(yōu)化,轉變成為自已的內容。提升自已寫Shader的能力。
????最后感謝達哥的分享。