生成Sinhash和Fracthash Noise
在Shader中要生成隨機(jī)數(shù),就要生成Noise圖,通常來說我們都知道可以用sin+fract函數(shù)。這種方法也叫Sinhash。
當(dāng)a越來越大的時候,你會發(fā)現(xiàn)其函數(shù)圖像會變得非常隨機(jī)的樣子,我們?nèi)∑渲幸欢尉蛯?shí)現(xiàn)了隨機(jī)。fract函數(shù)的意思是取小數(shù)部位。

這也是The Book of shaders介紹的方法,這邊是對應(yīng)章節(jié)的鏈接 https://thebookofshaders.com/10/
我們隨后可以用這個方法生成一些噪聲圖。
簡單封裝一下大概是這個樣子。

我們可以用dot也就是dotproduct也就是點(diǎn)積,這種計(jì)算方法會更好一點(diǎn)。輸入一個二維向量,然后輸出一個范圍在0-1的float浮點(diǎn)數(shù)。之后再乘以一個更大的數(shù),我們就實(shí)現(xiàn)了基本的隨機(jī)。
隨機(jī)數(shù)會有影響,你可以自己隨便選一個數(shù)字,但是可能會在具體功能上有一定的偏差,如果不需要解決問題那就用自己隨便想的好了。
讓我們再來看看另一種隨機(jī)數(shù)生成方法,Fracthash。
這種方法沒有用到sin,但是同樣需要fract。
這是封裝后的代碼。

這個也不是我自己想出來的,之前寫了一個shader評論區(qū)下面有人給我指點(diǎn)的意見。

直接調(diào)用這個函數(shù),我簡單的將兩個生成方法放在一起做了對比

左邊是sinhash,右邊是fracthash,這咋看沒啥區(qū)別,但是在后面加了一個iTime讓其動起來后會發(fā)現(xiàn)sinhash有一絲割裂感,而fracthash會更加自然。
具體可以看看我在shadertoy寫的這個shader:https://www.shadertoy.com/view/mssXz7
本期內(nèi)容大概就是這些,希望對你有幫助。