仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。 2025年からzennに移行

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

2010年03月

パーリンノイズとは

最近まともなプログラムの技術解説をして来なかったけど、やっと新しい技術関連記事を書く気になったこのごろ・・
初期と比べ技術解説もマイナーな方向に行き、だんだん自分がマニアックな方向に進んでいくのがわかる・・


そして次の記事では「パーリンノイズ」について書いていこうと思う。

これはなんというか、あまりにマニアックすぎて解説HPが英語のサイトしかないようなものであるが(wikipediaにも詳しくのってない)、その英語のサイトを高1までの知識で無理やり解読したところ、これは意外と需要があるのではないかと思い自分なりにまとめて書いてみようと思った。


まずパーリンノイズというマニアックなコンピューターグラフィックス作成技法にたどり着いたわけを説明しよう。

プログラムだけでリアルな雲、炎の再現に挑戦しようとしたのがことの発端。

本来の科学的手法ならリアルな雲や炎を作るには流体方程式や乱流方程式をコンピューターにとかせるという、アマチュアプログラマーにとっては物凄く難しい課題があったわけだが、それをしなくても擬似的にそれっぽく見せる方法があって、それもかなり簡単なプログラムでできるというのだ

それがパーリンノイズ・・

これで作られる画像は自然界にある雲に似ていて、ほかにもパーリンノイズを使えば、「年輪」の表現や、大理石の幾何学模様が簡単に作れてしまうと言う!

ほかにもフラクタル平面とかいうのと関係あるらしい
ランダムな高低差の山を作れたり、パーリンノイズで作った画像は連番アニメーションにしても縦横につなげてもつなぎ目が全く気にならないなど、いろいろな使い方ができるのだ!



もともとグラフィックの画力が極端にない私はプログラムでエフェクト画像を生成することが多く、パーリンノイズを使えば作れる画像がさらに飛躍的に多くなるってことで、興味がわいた訳だ。

プログラムの中でも四則演算と画像処理の分野は自分の十八番で、ひとまずパーリンノイズは画像処理のアルゴリズムとして自分で極めたいというのがあるので、次の記事では徹底的に細かいところまで書いていこうと思う・・・。

レイトレーシングとパーリンノイズの組み合わせなんてのも考えてみたのでそれもCG画像がうまく作れたらUPしたいと思っている。

次回のパーリンノイズの技術解説の記事では、「自分の全ての知識が詰まっていると言っても過言ではない」って言えるくらいに頑張って書いていきたい!

※2019/12、今まで自分がパーリンノイズだったと思っていたものがバリューノイズというものであると知りました。適宜記載修正しました。

なぜかツールを公開することに

先日、メカマスター氏から画像変換ツールの作成の依頼を受けた。



なんでも、ブログ書いてて画像を貼り付けるとき、ネットで拾ってきた画像をアメブロにUPするため何枚も適度な大きさに縮小するのが大変だということらしいのだ




ツールの出来がよかったのか気に入ってくれて、公開することになった!わーい

やっぱり自分のプログラムが人の役に立つというのはうれしいもんだなぁ(‐^▽^‐)!!





のだが、ツールを作るにあたり痛感したことがあった・・



それは・・

機能と努力(=プログラミングした時間)がまったく比例しないことだ!



簡単なツールだしプログラムは一瞬で終わるだろうと最初思っていた自分が今では情けない・・・

最初は、jpg→jpgでどんな画像でも横サイズを300ドットに統一する、ということで開発がスタートした。



まず画像のサイズ変換。

これはgzoomという命令を使えば一瞬で終わる。いわばスクリプトの芯となるところだ。

これはアンチエイリアシングも自動でかけてくれるのでとても助かる。

これだけなら何ら問題ではない。



むしろ依頼ではjpgで読み込みjpgで出力をしろと言っている。この部分だ!



実はHSP単体ではjpgで読み込むことはできても、jpgで出力することはできない!!

なんなんだろうかこの仕様・・

可能にするには新しい命令セットであるdllを導入しなければならない。




このためだけに外部ファイル「hspcv.dll」が必要になりソースのサイズが30行程度だったのが170行にまで増大した!

まぁその差の140行分はコピペだからぜんぜん大変じゃないんだけど、それでも画像保存命令はhspcvのを使わなきゃいかんし、途端にソースが複雑になった。



普通HSPの実行ファイルは120Kb前後なのだが、外部ファイル「hspcv.dll」=1.66Mbがついたことによりファイル全体が十数倍のサイズにまで膨れ上がった!

そう、bmp出力でなくjpg出力にするためだけにだ・・




しかしこれは序章に過ぎない!!

jpg読み込みをするとき「ドラッグ&ドロップ形式」で読み込んでほしいという依頼をすっかり見落としていたのだ!

私は単純に「ダイアログ形式」で画像を読み込むとプログラムがすごい簡単なのでそれでプログラムを組んでいた。ところが、読み直して気づいて事態が一変!


またもやHSPの壁。

ウィンドウにドラッグ&ドロップでもってきたファイルは、HSP標準命令では扱えない!

ドラッグ&ドロップで画像データを読み込むにはWin32 API関数を使わないといけない!

用はめんどくさいのだ!


具体的にどのくらい大変なことになるのか。

まずダイアログ形式で読み込むときは

dialog "",16

picload refstr

こんなんでいい

2行だ。ほかにバッファの確保、いろいろエラー防止の機能がつけられてもせいぜい15行くらいだろう。


しかしドラッグ&ドロップ形式で読み込むとなったときは、llmodだったかなぁ、2種類のモジュールをインクルードしないといけない。


HSPでドラッグ&ドロップが可能になるまでにソーススクリプトは800行も増えた・・。

この800行はコピペだ

が、そのあとの処理はプログラムする側にゆだねられているので

結局そこが大変なのである。


上のような2行の命令ではすまなくなる

ドラッグされるまで10行くらいあるルーチンをループし続け

ドラッグされ終わると文字型変数にそのファイルのディレクトリが保存、数値型変数にファイル数が出力される

そしたらループを抜け出し、まずファイルの数を確認し文字型変数からディレクトリを一つ一つ抽出しなければならない

いろんな命令でそれらをやりおえて、やっと、

picload 命令が使えるようになるのだ。



こうした見た目とは裏腹にプログラムの世界の大変さは地味なところにある。



普通に見ると多分、アンチエイリアシングとか、表示されている赤球の移動の計算が大変なのだろうと思うかもしれない。

が、私が一番大変だったのは画像を読み込むとき、読み込めるデータかそうでないかを識別することだった。

それは結局実装できなかった・・・ユーザーの皆さんごめんなさい


面白い話ではないが、こんな地味な・・・と思うようなところにいつもプログラマーは頭を悩ませているということを言いたかった。なんとも理不尽なことにw。

あー書きまくったらすっきりした!





ところで完成した「一定サイズ圧縮拳」には裏技機能がある!

まず1回起動すると「圧縮済み画像」というフォルダができるはずだ。

そこには圧縮画像と、システムデータが保存されてある。

システムデータは「sdata.txt」という名前で保存されていて、それは画像形式やサイズを保存している以外に「jpg品質」という数値も保存してある。

この「jpg品質」だけはツールのほうで指定できないのでこれを知ってる人しか変更できない。

なんでこんなややこしいことしたのかというと話は長くなるが、メカマスター氏と話して、シンプルいずベストってことになったからだ。

この品質は標準で95に設定されているが、txtで1~100に書き換えることでツールに反映される。


だからなんだwってことかもしれないけど遊び心でっでいうことで・・・




PS

あくまでvictorに転がってるようなしょうもないツールですが、メカマスター氏のブログを見てくださっている人にこのツールをご贔屓していただくと幸いです!

ダウンロードはコチラ です

プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ