Perlin noiseのことを最初適当に知ろうと思ってwikiってみたが、なんかあんま参考にならん・・・ページの下に関連リンクがあったので覗いてみた。

生成方 

KEN 


ぎゃぁーす?!2つとも苦手な外国語(多分英語?)のサイト・°・(ノД`)・°・  じぇんじぇん意味わからん・・・
図やグラフから文章を推測するというなんとも奇妙な解読法で、なんとか理解したような気がした。



実際プログラムするときは上の生成方の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…)に、関数の返り値に取ったグラフが下だ。
 



noise(a) の値

31b08ed0.png 

Pnoise(a)の値

e8644708.png

こうやって見ると一目瞭然である!
(もしや・・・Pnoise(a)は、グラフの微分係数をランダムな値にすればできるのでは?って思うかもしれないけどそうでもない!ま、具体的なPnoise(a)関数の生成方は後にして・・・)


パーリンノイズの特徴はなんといっても、山の起伏のような、自然なばらつきがある雰囲気を出せることなのだ。


このPnoise(a)関数を使えば年輪などの模様ゆらぐようなテクスチャを作れるって言う、ちょっと想像もつかないような話なのだが、本当だ。




Perlin noiseの原理


すぐ上で想像もつかないとか言っておきながらいきなり原理の話だ。まぁ百聞は一見にしかずだ。


まずいきなり完成系の画像をお見せしよう!


の画像が、パーリンノイズで作った雲のテクスチャである。
MAP1
9b639540.png

これは計算結果で、今からその生成過程を逆から追っていこうと思う。


MAP1                                MAP2(一番基本のもの)

9b639540.pngまずMAP1画像は、MAP2画像の02c458d3.png




全てのドットのr,g,bをlogで処理し、最適化したものだ。(MAP2の生成法は後ほど・・・)



MAP2は一番基本の状態のもので、さまざまな模様を作る時の元になるテクスチャである。MAP2MAP1 に変換する部分を具体的に言うと、r,g,bの範囲は整数で0~255なので、まずMAP2の(x,y)のドットのr,g,,bを取得。グレースケール画像なのでr,g,bのどれか一つがわかればいいが。


で  log e (r)  は、どんなにrが最大で255なので log e (r) は大きくても5.54…程度にしかならない。そこで46.0を掛けて 46.0*log e (r) としてr,g,,b用に最適化をする。さらに濃淡を濃くするために 4.0 を掛けるとか、logで処理した後定数で減算するなどして、MAP1 の(x,y)のドットのr,g,bを決定していくのだ。


MAP1を黒飛びや白飛びさせたいなら少なくとも46.0以上じゃないといけないし、黒飛びは減算しないと絶対ならない。   xとyは当然横縦のピクセル。





MAP2の生成過程はというと以下のようにすればいいことがわかる。


一番左の画像=ぼかす前&拡大前


0d6d9c92.jpg

80db9bc1.jpg


画像×6枚は、単にランダムな濃さの点を打って作成したノイズ画像である。


ただし6枚それぞれが、ドットの数というかスケールが違うのだ。



上から256ドット四方、128、64、32、16とスケールが2分の1ずつ小さくなっている。



なので一番左の画像枚数のことをオクターブと呼ぶ。


今回は6枚なので6オクターブと言うことになる。普通5~6である。


あまり少なくしても、細部のスケールが表現できなかったりするし、大きすぎても処理時間がかかるだけなので・・・



ぼかす処理はガウスぼかし等で。そしてぼかし終わった後できた256ドット四方の6枚の画像を加算合成するのだが、



普通加算するときにブレンド率にpersistence(振幅の変化)を掛けて加算する必要がある。


つまり左の自家製の汚いイメージ図で言うと、上のほうの画像を弱く、下のほうの画像を強くして加算合成することでMAP2ができあがるのだ。


「最初一番小さくて一番拡大する画像ほどpersistenceは大きく、一番拡大しない画像ほどpersistenceを小さくして加算することが重要!」



具体的に言うと、拡大しない画像ほどブレンド率2分の1ずつに減っていくのが理想の形!


上の画像は1.8分の1なので約2分の1と言える。












力尽きたので続きは次の記事で・・・


次回:パーリンノイズアルゴリズム 後編