1. 程式人生 > >小強學渲染之Unity Shader噪聲應用

小強學渲染之Unity Shader噪聲應用

  之前玩Tencent的仙劍4手遊時,殺死boss會看到boss有“消融”的效果,就是身體上有多個洞洞然後往四周擴散直至屍體完全消失,但效果是沒有關閉背面剔除的“穿幫”效果,可能也是考慮效能因素。 emmmm,那下面開始詳細講解消融等等噪聲相關應用的實現~

  · 消融效果

  噪音,就是“沙沙渣渣渣”的雜亂無章的聲音,在圖形學中使用噪聲是為了把一些隨機變數來引入到程式中,如火焰、地形、雲朵的模擬等等都要使用隨機變數。有人可能會問,直接使用random這種函式不就好了嗎?為什麼要引入這麼多演算法生成的特定噪聲呢?原因在於生成的隨機值太“隨機”了,在圖形學中稱這種噪聲為“白噪聲”(功率譜密度在整個頻域內均勻分佈的噪聲),通俗理解就是類似小時候電視機上面的雪花噪聲,

   (二維的白噪聲紋理)

  噪聲的基礎來自於隨機數,若螢幕上的每個畫素點給一個0~1之間的隨機數來表示象素點的亮度,就能得到上面的白噪聲紋理,很像老式電視機故障時的黑白雪花。這種隨機影象並沒有太大的作用,因為每個點的隨機數都是離散的,相互完全沒有關係,能看到這幅影象中的世界是完全沒有邏輯,沒有能量的。  既然基本隨機噪音因離散性而沒意義,那就人為讓噪音連續起來,這種平滑的連續化處理就是插值,在離散資料中間用函式插值的方法把空隙填滿空間就自然連續了。

  簡單的線性插值得到的稜角分明的結構,指數/三角函式等插值組合能形成各種插值演算法,從而對應多種不同噪聲。如Perlin噪聲被大量用於雲朵、火焰和地形等自然環境的模擬;Simplex噪聲在其基礎上進行改進,提高效率和效果;而Worley噪聲被提出用於模擬一些多孔結構,例如紙張、木紋等。有關噪聲演算法的詳解,可參考 

【圖形學】談談噪聲

  不管怎樣,對簡單隨機噪音插值後都能得到一種像黴菌表面的影象,本節的噪聲紋理如下圖:

  

  開始編碼,表現效果就是從不同的區域開始,並向隨機方向擴張,最後整個物體都將消失不見。

  原理:使用噪聲紋理進行取樣,將取樣的結果和某個控制消融程度的閾值比較,若小於閾值就用clip函式將對應畫素裁剪掉(透明度測試處理),不裁剪掉的畫素就和另外兩個顏色來進行混合插值處理從而達到燒焦的效果,並且將光照陰影和衰減也按照同樣的處理,避免錯誤的投射陰影。

  完整程式碼如下:

  

  資料連結:

  《Unity Shader 消融效果原理與變體

  《Simplex噪聲及其生成原理