GPU Gems1 - 5 改良的Perlin噪声的实现
Perlin 噪聲
KenPerlin(1985a,2002)KenPerlin(1985a,2002) 定義的噪聲函數是最常用的噪聲函數,稱為 Perlin 噪聲。PerlinPerlin 噪聲在全部 (x,y,z)(x,y,z) 整形頂點處的參數值都為 00,變化源自各頂點間的梯度向量,然后再進行平滑插值。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 計算四個頂點的導數,再進行平滑的表面插值
perlin噪聲應當滿足的性質:
- ? ? ? ? 1.?旋轉統計不變性。(不管我們怎么旋轉它的域,它都有同樣的統計特性)
- ? ? ? ? 2.?頻率帶通有一定界限。(它沒有明顯的大或者小的特征,而是在一定范圍內)
- ? ? ? ? 3.?平移統計不變性。(不管我們如何平移它的域,它都有同樣的統計特性)
計算方法
???1.預處理:考慮x,y,z空間中所有點的集合(坐標為整數),我們稱這個集合為整數格。現在我們為整數格的每個點附一個(x,y,z)上的偽隨機梯度值,也就是一個向量,并且要將其 處理成單位向量。
???2.如果(x,y,z)處在整數格上,那么此處的噪聲就是d。
???3.如果(x,y,z)不在整數格上,我們計算光滑插值系數。
??具體的插值方法如下,以二維為例,我們要找到這個點周圍的四個整數點,然后我們得到四個值,橫坐標為bx0 ~ bx1,縱坐標為by0 ~ by1。點到bx0在x軸上的距離為rx0,到by0在y軸上的距離為ry0。perlin給出了一個緩和曲線使得線性插值連貫。能使得一階導數連續的緩和曲線函數 (最初的版本) : s_curve(t) ( t * t * (3. - 2. * t) )之后分別將rx0和ry0傳入緩和曲線,得到一個新的值sx和sy。
?接下來做一個雙線性插值,sx和sy就是第一步線性插值的系數,但是計算得到系數之后,我們還需要插值的起點和終點。他們的計算方法如下:
- ?求(rx0,ry0)與左上角點的梯度b00的點乘,得到起點u,求(rx0 + 1,ry0)與右上角點的梯度b10的點乘,得到終點v,以uv為兩端,sx為插值系數,做線性插值,得到a
- ? 求(rx0,ry0 + 1)與左下角點的梯度b01的點乘,得到起點u,求(rx0 + 1,ry0 + 1)與右下角點的梯度b11的點乘,得到終點v,以uv為兩端,sx為插值系數,做線性插值,得到b
- ? 最終,對a和b進行線性插值,插值系數為sy,得到最終的結果。
?????????以上算法步驟中,先對x軸還是先對y軸插值其實是無所謂的。最終得到的柏林噪聲分布在 -1 ~ 1之間,我們可以把它映射到我們需要的顏色區別(比如0 ~ 255 或 0 ~ 1)得到對應的顏色。
二維拓展到三維,柏林噪聲的生成方法偽代碼可以概括如下:
? ? Float Noise(Float x, Float y, Float z) {
? ? ? ? <計算八個頂點整數坐標,以及偏移量>
? ? ? ? <計算梯度權值>
? ? ? ? <權重進行三線性插值>
? ? }
GEM這篇文章提到的改進點概括起來是兩點:
1.更換曲線函數為二次偏導連續的:s_curve(t) ( t * t * t * (6 * t * t - 15 * t + 10) ),從而解決使用噪聲的導數時出現失真的視覺效果,例如制作凹凸貼圖時。
2.將256大小的偽隨機查找表改成大小為12,值為立方體12條邊中點。從而解決噪聲函數的結果中產生不希望的高頻
?
總結
以上是生活随笔為你收集整理的GPU Gems1 - 5 改良的Perlin噪声的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联合概率(joint probabili
- 下一篇: GPU Gems1 - 7 无数波动草叶