perlin noise


テクスチャ生成の古典中の古典、perlin noiseをレンダリングしてみる。これは要するに、gimpを使ったときに"下塗り"→"雲模様"で出てくるようなモノ。

レンダリング手法はリファレンス実装そのままのノイズ生成と普通の合成。

perlin noiseは、一つレンダリングするだけだとぼんやりした感じになるが、それを複数のオクターブにわたって足し算してやると雲のような模様になる。
たとえば1オクターブのレンダリングに絶対値を適用すると、うねうねとしたパターンがあらわれる。

こういうオーガニックっぽいパターンを生成するのがなかなか面白い。"Photoshop 雲模様"とかで検索すれば、そうとう多くの応用があることがわかるはず。

perlin noise以外にもこの手のノイズはたまに提案されている。

ループの書き方

以前AO benchの時に指摘された

x,yでループするような構造はdotimesとかsrfi-42使った方が見やすいと思う。

ということで、srfi-42を使っている。ソースコード中のsum-ecとかdo-ecがそれで、iを増やしながら式を足し合わせるコードは、

(sum-ec (: i 0 oct)
 (* (expt decay i) (noise (* step x (expt 2 i)) (* step y (expt 2 i)) 0)))

のように書ける。非常に便利。
ようするに、単純なx-yループであれば、

(do-ec (: x x-from x-to) (: y y-from y-to) (loop-body x y))

のように書ける。(順序の規定はどうなってるんだろう?)
Gaucheの説明がわかりやすい。

uvector

あと、moshにはuvector(srfi-4)が無いので、適当に書いて追加している。

当然本来的には本体側にネイティブで実装されるべきだが、今のところffiがbytevectorしか渡せない仕組みなので単純に追加するわけにも行かない。
多分、gaucheがuvectorパッケージでaliasを提供しているように、ベースとなるbytevectorとそれに対するaliasとしての各種uniform vector(や文字列などの固定長メモリプール)を提供すべきだろう。