<   2016年 03月 ( 1 )   > この月の画像一覧

パーツ敷き詰めテクスチャ生成、アルゴリズム改

2Dの小さい画像をたくさん組み合わせて、1つのキャラを作って動かす方式を、
多関節キャラと呼んだりするが、昔からある、メジャーなアニメーション手段だ。
 
昔のハードは、2Dと言えば、スプライト。
多関節キャラもスプライトをいくつも重ねて作られている。

現在のハードは、スプライトなどなく、ほぼすべてOpenGL系のポリゴンハードだ。
なので、

 パワーアップきのこ <> 1UP きのこ

のように、パレットだけ変えて使いまわす、などはできない。
多関節キャラもポリゴンを重ねて表現するしかない。

なので効率よくするため、それぞれの構成パーツ画像を1つの画像にまとめて、
1枚のテクスチャにしている。
メモリに余裕があるハードなら、各パーツばらばらのまま突っ込んでも良いんだろうケドね。

(通常、テクスチャは、2の乗数のサイズにしなければならないので、33x18 なんてサイズのパーツがあったら、64x32 にまで大きくしなければならず、無駄が多い)

そこで、敷き詰めの効率をあげるためのアルゴリズムが必要になるわけだ。
といっても、それ自体は大したことなくて、パーツを大きい順にソートして、端から配置するだけで、
それなりに綺麗に詰められるのだ。

だがしかし、もちろん落とし穴がある。
単純に敷き詰めるだけではだめなのだ。

1枚のテクスチャにした後、パーツ画像として表示するには、切り抜いて表示する。
その際、切り抜く矩形の周囲にドットがあると、バイリニアフィルタの補完で巻き込まれて、ゴミがでるのだ。
これまた昔からの習慣ではあるのだが、パーツ間は、1ドットの空白を空ける、というのが鉄則。

で、これらを踏まえて、パーツを敷き詰めるコンバーターを作成し、それなりのテクスチャが出来たので満足していたのだが。

パーツ間に異様な空白が空いているものが、多々見つかるようになった。
ツールの不具合ではない。

パーツ画像そのものに空白が含まれていたのだ。
酷いものになると、半分以上の面積が空白なものもあった。

無駄が目立つようになったので、さらにアルゴリズムを大改造!
パーツ内部の空白を他のパーツと共有化し、詰める!

ついでにスピードのボトルネックも解消しておいた。

久々に、結果に感動できたプログラミングだった。
[PR]
by miries | 2016-03-18 23:52 | ゲームを作る