基於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 收到了美國電影藝術與科學學院頒發的奧斯卡科技成果獎.

SD內的Perlin(不同大小)


從低維開始說起. --- 2D Perlin Noise

I. 工欲善其事,必先利其器 ---FX Map

SD使用了FX map來實現Perlin noise. 其原理與Perlin提出的演算法非常不同. 這裡先介紹一下fx map節點. fx map原理基於markov chain(馬爾科夫鏈), 比較簡單的數學定義如下:

給定初始向量 x_{0} , 矩陣 A , 則我們可得到如下一組向量:

x_{1} = Ax_{0}, ..., x_{n} = Ax_{n+1}; nin N^{*}

在Substance Designer的fx map中, 這種邏輯關係表現為一條從底端到頂端的鏈, 如圖:

英文解釋, 英語能力不錯的同學可以看看

詳細的解釋我會在後面有必要的時候一一給出; 如果英語可以的話不妨看看這篇文章:

Substance Designer - Impressions?

blog.runevision.com

根部(最頂端橙色高亮的那個節點)為整個鏈所有數據最終的輸出口.

其中最重要的節點是Quadrant節點; 其功能為把圖像進行一次4分;

一次四分, 節點四個輸入分別接收四個區域的圖像

2次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捏臉系統

TAG:技術美術 | 圖像處理 | 遊戲開發 |