Perlin noiseのことを最初適当に知ろうと思ってwikipediaをのぞいてみたが、なんかあんま参考にならん・・・ページの下に関連リンクがあったので覗いてみた。
(2019/12現在リンク切れ)
図やグラフから文章を推測するというなんとも奇妙な解読法で、なんとか理解したような気がした。
実際プログラムするときは上の生成方のHPが参考になった。
ではわかったことだけでもまとめていきたいと思う。
Perlin noise と普通のnoiseの違い (導入)
以下の話は全てパーリンノイズではなくバリューノイズというやつでした。すみませんでした。パーリンノイズは近日中にコード載せます。
定義の話とか面倒なので具体的な話から・・
ノイズ関数とパーリンノイズ関数があったとしよう。
ノイズ関数・・・noise(a)
パーリンノイズ関数・・・Pnoise(a)
2つの関数は-100~100までのどれかの整数値を返すとして
aに0,1,2,3,4・・・と代入していき、それぞれの関数からどんな値が返ってくるか。
noise(a)はというと・・・
61,-79,24,-10,-31,95,7,56,-88,-12,8,-47
Pnoise(a)はというと・・
36,22,-19,-14,-45,-50,-38,12,52,59,59,53,69,89
ノイズ=完全にランダム。ばらついてる。規則性がない。
パーリンノイズ=規則性が見えないけどちょっと連続しているような・・・。ランダムに見えて不自然にばらついてるようなランダムではない。
a(0,1,2,3…)を横に、関数の返り値を縦に取ったグラフが下だ。
こうやって見ると一目瞭然である!
(もしや・・・Pnoise(a)は、グラフの微分係数をランダムな値にすればできるのでは?って思うかもしれないけどそうでもない!ま、具体的なPnoise(a)関数の生成方は後にして・・・)
パーリンノイズの特徴はなんといっても、山の起伏のような、自然なばらつきがある雰囲気を出せることなのだ。
このPnoise(a)関数を使えば年輪などの模様や雲のゆらぐようなテクスチャを作れるって言う、ちょっと想像もつかないような話なのだが、本当だ。
Perlin noiseの原理!
バリューノイズの原理!
まずいきなり完成系の画像をお見せしよう!
これは以下のように作る
一番左の画像=ぼかす前&拡大前
画像×6枚は、単にランダムな濃さの点を打って作成したノイズ画像である。
ただし6枚それぞれが、ドットの数というかスケールが違うのだ。
上から256ドット四方、128、64、32、16とスケールが2分の1ずつ小さくなっている。
なので一番左の画像枚数のことをオクターブと呼ぶ。
今回は6枚なので6オクターブと言うことになる。普通5~6である。
あまり少なくしても、細部のスケールが表現できなかったりするし、大きすぎても処理時間がかかるだけなので・・・
ぼかす処理はガウスぼかし等で。そしてぼかし終わった後できた256ドット四方の6枚の画像を加算合成するのだが、普通加算するときにブレンド率にpersistence(振幅の変化)を掛けて加算する必要がある。
つまり左の自家製の汚いイメージ図で言うと、上のほうの画像を弱く、下のほうの画像を強くして加算合成することで完成系ができあがるのだ。
「最初一番小さくて一番拡大する画像ほどpersistenceは大きく、一番拡大しない画像ほどpersistenceを小さくして加算することが重要!」
具体的に言うと、拡大しない画像ほどブレンド率が2分の1ずつに減っていくのが理想の形!
上の画像は1.8分の1なので約2分の1と言える。