日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GPU Gems1 - 5 改良的Perlin噪声的实现

發(fā)布時(shí)間:2023/12/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GPU Gems1 - 5 改良的Perlin噪声的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Perlin 噪聲

KenPerlin(1985a,2002)KenPerlin(1985a,2002) 定義的噪聲函數(shù)是最常用的噪聲函數(shù),稱(chēng)為 Perlin 噪聲。PerlinPerlin 噪聲在全部 (x,y,z)(x,y,z) 整形頂點(diǎn)處的參數(shù)值都為 00,變化源自各頂點(diǎn)間的梯度向量,然后再進(jìn)行平滑插值。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 計(jì)算四個(gè)頂點(diǎn)的導(dǎo)數(shù),再進(jìn)行平滑的表面插值

perlin噪聲應(yīng)當(dāng)滿(mǎn)足的性質(zhì):

  • ? ? ? ? 1.?旋轉(zhuǎn)統(tǒng)計(jì)不變性。(不管我們?cè)趺葱D(zhuǎn)它的域,它都有同樣的統(tǒng)計(jì)特性)
  • ? ? ? ? 2.?頻率帶通有一定界限。(它沒(méi)有明顯的大或者小的特征,而是在一定范圍內(nèi))
  • ? ? ? ? 3.?平移統(tǒng)計(jì)不變性。(不管我們?nèi)绾纹揭扑挠?#xff0c;它都有同樣的統(tǒng)計(jì)特性)

計(jì)算方法

???1.預(yù)處理:考慮x,y,z空間中所有點(diǎn)的集合(坐標(biāo)為整數(shù)),我們稱(chēng)這個(gè)集合為整數(shù)格。現(xiàn)在我們?yōu)檎麛?shù)格的每個(gè)點(diǎn)附一個(gè)(x,y,z)上的偽隨機(jī)梯度值,也就是一個(gè)向量,并且要將其 處理成單位向量。

???2.如果(x,y,z)處在整數(shù)格上,那么此處的噪聲就是d。

???3.如果(x,y,z)不在整數(shù)格上,我們計(jì)算光滑插值系數(shù)。

??具體的插值方法如下,以二維為例,我們要找到這個(gè)點(diǎn)周?chē)乃膫€(gè)整數(shù)點(diǎn),然后我們得到四個(gè)值,橫坐標(biāo)為bx0 ~ bx1,縱坐標(biāo)為by0 ~ by1。點(diǎn)到bx0在x軸上的距離為rx0,到by0在y軸上的距離為ry0。perlin給出了一個(gè)緩和曲線使得線性插值連貫。能使得一階導(dǎo)數(shù)連續(xù)的緩和曲線函數(shù) (最初的版本) : s_curve(t) ( t * t * (3. - 2. * t) )之后分別將rx0和ry0傳入緩和曲線,得到一個(gè)新的值sx和sy。

?接下來(lái)做一個(gè)雙線性插值,sx和sy就是第一步線性插值的系數(shù),但是計(jì)算得到系數(shù)之后,我們還需要插值的起點(diǎn)和終點(diǎn)。他們的計(jì)算方法如下:

  • ?求(rx0,ry0)與左上角點(diǎn)的梯度b00的點(diǎn)乘,得到起點(diǎn)u,求(rx0 + 1,ry0)與右上角點(diǎn)的梯度b10的點(diǎn)乘,得到終點(diǎn)v,以u(píng)v為兩端,sx為插值系數(shù),做線性插值,得到a
  • ? 求(rx0,ry0 + 1)與左下角點(diǎn)的梯度b01的點(diǎn)乘,得到起點(diǎn)u,求(rx0 + 1,ry0 + 1)與右下角點(diǎn)的梯度b11的點(diǎn)乘,得到終點(diǎn)v,以u(píng)v為兩端,sx為插值系數(shù),做線性插值,得到b
  • ? 最終,對(duì)a和b進(jìn)行線性插值,插值系數(shù)為sy,得到最終的結(jié)果。

?????????以上算法步驟中,先對(duì)x軸還是先對(duì)y軸插值其實(shí)是無(wú)所謂的。最終得到的柏林噪聲分布在 -1 ~ 1之間,我們可以把它映射到我們需要的顏色區(qū)別(比如0 ~ 255 或 0 ~ 1)得到對(duì)應(yīng)的顏色。

二維拓展到三維,柏林噪聲的生成方法偽代碼可以概括如下:

? ? Float Noise(Float x, Float y, Float z) {
? ? ? ? <計(jì)算八個(gè)頂點(diǎn)整數(shù)坐標(biāo),以及偏移量>
? ? ? ? <計(jì)算梯度權(quán)值>
? ? ? ? <權(quán)重進(jìn)行三線性插值>
? ? }

GEM這篇文章提到的改進(jìn)點(diǎn)概括起來(lái)是兩點(diǎn):

1.更換曲線函數(shù)為二次偏導(dǎo)連續(xù)的:s_curve(t) ( t * t * t * (6 * t * t - 15 * t + 10) ),從而解決使用噪聲的導(dǎo)數(shù)時(shí)出現(xiàn)失真的視覺(jué)效果,例如制作凹凸貼圖時(shí)。

2.將256大小的偽隨機(jī)查找表改成大小為12,值為立方體12條邊中點(diǎn)。從而解決噪聲函數(shù)的結(jié)果中產(chǎn)生不希望的高頻

?

總結(jié)

以上是生活随笔為你收集整理的GPU Gems1 - 5 改良的Perlin噪声的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。