以下の説明は引き続きバリューノイズの説明です。パーリンノイズは近日中にコード載せます

完成系
02c458d3.png

を作るには今まで説明に使ってきたような、テクスチャをいくつか使用して作る方法と、関数のみで作る方法の2種類がある。
関数のみでやる場合、作業用のテクスチャは1バイトも使わなくてすみ、並列処理化が容易であるためGPUでの処理もできる。
関数のみで作る方法は前の記事の外部リンク(リンク)で見ることができた。
自分でもHSPで関数のみのほうのアルゴリズムを作ってみたのだがどっかにやってしまった・・・
結局テクスチャを使うほうが圧倒的に早かったのだ

ちなみに前の前の記事で載せたgifたちは全て完成系を3D展開して、sin やらabsやら1/fの変換をほどこしたものである。
そして3Dのスライス面をgifのフレームに対応させてある

後編というわりに内容がほとんどないけどパーリンノイズの話は終わり
アルゴリズムのアの字も書けなかった・・ソース発見したらはるかも







追記、ソース発見!!

HSPスクリプトエディタに貼りつければ単独実行
(※処理に時間がかかります・・3分とか)

#module

#defcfunc Interpolate double a,double b,double c;aとbのあいだをcos補間で出す(内挿処理)
f = (1.0 - cos(c * 3.1415927)) * 0.5
return a*(1.0-f) + b*f

#defcfunc Noise int x,int y;ただのランダム数値を出す
z=y*9799+(y*y+435547)*(x-904120)*319-8129471
r=(z-32459)*(z+235152)+z+9022093
repeat (abs(z))\19+13+((r\11)*82)\12
r=(r+1114122123)*(r-108612193)+1182655124+r\12392874
loop
return 1.0*(r*(r*r*15731+789221)+1376312589)/2147483647.0

#defcfunc SmoothedNoise int x,int y;ガウシアンフィルタ3*3
return Noise(x, y) / 4+( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8+( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16

#defcfunc InterpolatedNoise double a,double b;加算合成する前の画像のx,yのドット色を出す
integer_X = int(a)
fractional_X = a - integer_X
integer_Y = int(b)
fractional_Y = b - integer_Y
v1 = SmoothedNoise(integer_X, integer_Y)
v2 = SmoothedNoise(integer_X + 1, integer_Y)
v3 = SmoothedNoise(integer_X, integer_Y + 1)
v4 = SmoothedNoise(integer_X + 1, integer_Y + 1)
i1 = Interpolate(v1 , v2 , fractional_X)
i2 = Interpolate(v3 , v4 , fractional_X)
return Interpolate(i1 , i2 , fractional_Y)

#defcfunc pnoise double a,double b;n枚の画像をブレンド率変えて加算合成
persistence=0.6
total = 0.0
p = persistence
n = Number_Of_Octaves@
frequency=1.0
amplitude=0.65
repeat n
total=total+(InterpolatedNoise(a*frequency,b*frequency)) *amplitude
frequency*=2.0
amplitude*=p
loop
return total

#global

;ここまで関数とかの定義

;スクリーンにレンダリング
Number_Of_Octaves=6
ddim k,640,480
screen 0,640,480,0

repeat 640
d=cnt
repeat 480
k.d.cnt=pnoise(0.01*d,0.01*cnt)
a=limit(218.0*(0.5+k.d.cnt),0,255)
color a,a,a
pset d,cnt
loop
loop
;bmpsave "a.bmp"



結果
f61c76fa.jpg