關於雜訊...

之前兩篇Procedure Cloud和Ray Marching Ocean的理論基礎其實就是雜訊(Noise)數據的運用, 繼而是關於隨機性(Stochastic)的運用. 本篇聊聊使用到的相關演算法.

Perlin Noise

Ken Perlin[1]在1985年SIGGRAPH發表了An image synthesizer, 把這個用於使用隨機描述自然的演算法公開. 可以說是很多雜訊演算法的基礎.

關於製作2D Perlin Noise的方法, 可以簡單描述為: 獲取4個臨近點的距離(稱作"梯度"), 與一個"隨機向量"做點乘, 然後插值獲取. 3D版本對應的改為8個臨近點做插值即可. 關於隨機數據, 可以使用預製做的貼圖或者實時計算. 下面我們用UE4 材質節點製作一個演示:

2D Perlin Noise

2D Perlin Noise MF

(不管我上傳多大的圖片, 它都這麼模糊... 點擊這裡看圖床高清版吧)

Hash MF

Hash函數主要把梯度值和隨機數做點乘, 想要省點計算就上一張比如在PS里做好的隨機圖, 為了演示目的我特意用了Iq的實時計算的方法(其實不太必要).

Simplex Noise

上述方法可以看到, 2D需要4個採樣, 3D需要8個採樣, 後來Ken Perlin, 前面提到的那位大神發現了一種更高效的演算法使得複雜度銳減:

O(n2^n) 
ightarrow O(n^2)

Ian McEwan[2]提供了一種實現:

Simplex Noise

Simplex Noise除了減少高維的計算量, 另一個特性就是更加的自然:

左邊: Perlin Noise, 右邊: Simplex Noise, 原始的Perlin Noise可以看出"重複"的樣式.

前面說過, simplex演算法比原始Perlin演算法要高效, 但是從截圖看貌似更複雜, 主要是由於UE4材質編輯的方式導致, 從代碼上比較好對比兩個演算法的難以程度.

因為這個藍圖看起來複雜也不好完整截圖, 所以想看具體演算法同學可以參考這裡.

Worley Noise

Worley Noise演算法比較好理解, 求當前位置跟一組隨機點的最小距離.

Worley Noise

Worley MF

(高清請點這裡)

我們靈活運用這三大Noise就可以模擬很多自然界的雲,山,雨,海. 後面有機會的話會一一展示給大家.


[1] Perlin, K. An image synthesizer. In Computer Graphics

(SIGGRAPH 』85 Proceedings)(July 1985), B. A. Barsky, Ed.,

vol. 19, pp. 28.

[2] Ian McEwan, David Sheets, Stefan Gustavson and Mark Richardson, Efficient computational noise in GLSL, 2011.

[3] Steven Worley, A Cellular Texture Basis Function, 1996.


推薦閱讀:

真良心大廠EPIC,頁游廣告又有新素材了!
steam發布篇---2
[UE4]Indirect Lighting Cache(間接光照緩存)

TAG:計算機圖形學 | 虛幻引擎 | 實時渲染 |