基於Substance Designer 的2D/3D Perlin Noise (I)
最近一直忙於準備考研...即便如此, 每天還是儘力擠出些時間來做些程序材質, 建模之類的練習. 最近研究了一下SD內部Perlin Noise的實現方式, 感覺很有學習價值, 就在這裡記下來吧.
Why Noise?
首先,
Noise(雜訊圖)在程序化內容生成領域佔據了相當大的篇幅, 也是整個領域的基石, 用通俗點的話來說, Noise圖就是圖像學裡的隨機數生成器; 數學裡我們生成一個隨機數, 而圖形學裡我們生成一張隨機圖像.
而Perlin Noise則是最為經典的噪音,沒有之一; 該雜訊被用於各種軟體包,比如 Autodesk Maya、SoftImage、3D Studio Max、Dynamation、RenderMan等. 因為在程序化材質領域的傑出貢獻, 1997 年K.Perlin 收到了美國電影藝術與科學學院頒發的奧斯卡科技成果獎.
從低維開始說起. --- 2D Perlin Noise
I. 工欲善其事,必先利其器 ---FX Map
SD使用了FX map來實現Perlin noise. 其原理與Perlin提出的演算法非常不同. 這裡先介紹一下fx map節點. fx map原理基於markov chain(馬爾科夫鏈), 比較簡單的數學定義如下:
給定初始向量 , 矩陣 , 則我們可得到如下一組向量:
在Substance Designer的fx map中, 這種邏輯關係表現為一條從底端到頂端的鏈, 如圖:
詳細的解釋我會在後面有必要的時候一一給出; 如果英語可以的話不妨看看這篇文章:
Substance Designer - Impressions根部(最頂端橙色高亮的那個節點)為整個鏈所有數據最終的輸出口.
其中最重要的節點是Quadrant節點; 其功能為把圖像進行一次4分;
II.言歸正傳--2d Perlin noise in substance
我其實更願意把這個實現方式叫做"偽perlin noise", 因為實際的實現方式就是把一大堆的Bell散布疊加在一起, 完全沒有perlin演算法的痕迹. 而這也導致了產生的noise比較規則化, 黑點和白點區域總是呈網格狀排列.
整個流程主體由2個邏輯相同, 只是其中一個加了部分位移的fx map節點組成:
這裡我就只拿其中一個FX-Map來解釋了:其基本結構如圖:
其基本邏輯: 構造一個循環, 使得圖案從中間向外部開始螺旋移動疊加; 每次加上一個新的Bell(即小圓圈)時, 對其施加微小的隨機位移和旋轉, 如下圖:
由於2d的實現版本比較簡單, 這裡就不多不多說了; 下篇文章講講正宗的perlin noise以及Substance最近新出的3d perlin noise節點.
推薦閱讀:
※GMS2官方教程系列4/8——瓷片&鏡頭
※KBEngine遊戲伺服器(一)——引擎環境配置
※針對中小遊戲的Unity3D插件推薦
※遊戲開發之伺服器技術選型淺析
※如何打造細緻的2D捏臉系統