每天一個shader技巧 day2 - 值噪音
噪音是什么及其應用
我的理解就是用一些數(shù)學方法去隨機生成一些看起來雜亂的數(shù)據(jù)。廢話少說,直接上圖(我也不是很會描述)

可以看到,噪音圖看起來雜亂無章(吵到眼睛了),那我們?yōu)槭裁匆蛇@一堆雜亂的像素呢。實際上在圖形,游戲領域中,噪音圖的應用是非常廣泛的,可以用來模擬水的流動,云層的流動,火焰的燃燒等。還可以用于游戲中自然地形的生成(我的世界的地形就是基于噪音算法生成的)。本文將會先介紹最簡單的值噪音如何生成及其應用。
噪音生成
上面提到了“用一些數(shù)學方法去隨機生成噪音”,下面就來看看是什么數(shù)學方法。我們先看一維的噪音怎么生成。定義一個隨機函數(shù)?,我們要做的便是使不同的x經(jīng)過計算后所得到的y看起來足夠“亂”。下面介紹常用的做法
結(jié)合使用fract函數(shù)和sin函數(shù)
fract函數(shù)
若將x作為輸入,fract函數(shù)取的是x的小樹部分,也就是說該函數(shù)的返回值是0-1。

sin函數(shù)
經(jīng)典的三角函數(shù)了,直接上圖

不難想到我們可以將sin函數(shù)的值輸入到fract函數(shù)中?

看起來是不是有點亂了,但是還不夠亂,我們給sin函數(shù)加兩個控制變量寫成(來控制振幅和偏移),然后再傳入fract中。

是不是就很“噪音”了,這就是一維噪音的生成了,下面看看2維的噪音如何生成。
2維噪音
先介紹最簡單的2維值噪音,先看下面這張圖。

和一維同理,我們要做的就是構(gòu)造一個函數(shù),z值則為我們想要的隨機噪音值。
那不難想到,我們可以在每個交叉點處生成一個隨機值,然后中間用插值過度即可(對就是這么簡單)
看看隨機數(shù)生成函數(shù)(可以隨意選擇生成函數(shù))
接下來就可以通過差值生成噪音圖了,直接上代碼。
然后應用獲得的噪音值
結(jié)果如下

但是!是不是看起來一塊一塊的,這樣的噪音圖是無法用來平滑的模擬水流,火焰燃燒等效果的,那么我們就需要一個分形布朗運動來解決這個問題。
分形布朗運動(Fractal Brownian Motion)
先說本質(zhì),本質(zhì)就是把不同的噪音圖按一定權(quán)重疊加起來。通常會定義五個值來控制不同噪音圖如何相加。分別為:
amplitude:表示每一次噪聲疊加的權(quán)值,
frequency:則是疊加噪聲的比例?
octaves:是循環(huán)次數(shù),可以看成疊加幾張噪聲
lacunarity和gain則是用于修改amplitude和frequency 的值,讓每次疊加的噪聲權(quán)值和大小都不同。
直接上FBM的代碼。
效果如下

平滑了很多是不是,接下來就能運用了。
模擬水紋
其實很簡單,只需要在對紋理進行采樣的時候,使用噪音圖對采樣的uv做一個偏移即可,直接上代碼和效果圖
