關於雜訊...
之前兩篇Procedure Cloud和Ray Marching Ocean的理論基礎其實就是雜訊(Noise)數據的運用, 繼而是關於隨機性(Stochastic)的運用. 本篇聊聊使用到的相關演算法.
Perlin Noise
Ken Perlin[1]在1985年SIGGRAPH發表了An image synthesizer, 把這個用於使用隨機描述自然的演算法公開. 可以說是很多雜訊演算法的基礎.
關於製作2D Perlin Noise的方法, 可以簡單描述為: 獲取4個臨近點的距離(稱作"梯度"), 與一個"隨機向量"做點乘, 然後插值獲取. 3D版本對應的改為8個臨近點做插值即可. 關於隨機數據, 可以使用預製做的貼圖或者實時計算. 下面我們用UE4 材質節點製作一個演示:
(不管我上傳多大的圖片, 它都這麼模糊... 點擊這裡看圖床高清版吧)
Hash函數主要把梯度值和隨機數做點乘, 想要省點計算就上一張比如在PS里做好的隨機圖, 為了演示目的我特意用了Iq的實時計算的方法(其實不太必要).
Simplex Noise
上述方法可以看到, 2D需要4個採樣, 3D需要8個採樣, 後來Ken Perlin, 前面提到的那位大神發現了一種更高效的演算法使得複雜度銳減:
Ian McEwan[2]提供了一種實現:
Simplex Noise除了減少高維的計算量, 另一個特性就是更加的自然:
因為這個藍圖看起來複雜也不好完整截圖, 所以想看具體演算法同學可以參考這裡.
Worley Noise
Worley Noise演算法比較好理解, 求當前位置跟一組隨機點的最小距離.
(高清請點這裡)
我們靈活運用這三大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(間接光照緩存)