2D

「人間のカスでもわかる2Dゲーム向けテクスチャードクアッド」的なものがどうしても見つからなかったのでいろいろ試す羽目になりました。僕はただ、2D絵を等倍で描画したいだけなんだ...。


とりあえず、

  • 等倍
  • 拡大縮小
  • 回転
  • アルファチャンネル

はできたっぽいです。しかし「DirectXで2D絵ならこれをやっておけ」的なもの写した訳ではないので、これでいいのかどうかすごい心配です。以下、やりかた。間違ってたらぜひご指摘ください。

頂点フォーマットにD3DFVF_XYZRHWを使う

座標変換済み頂点。これで頂点データの座標がスクリーン座標と解釈される。これで128x128のグラフィックを左上に描きたい場合は、0,0〜128,128の板ポリゴンをつくってテクスチャをはっつければよいっぽい。

ただし、この辺をみると座標のx,yそれぞれ-0.5した方がいいっぽい。
http://msdn2.microsoft.com/en-us/library/bb219690.aspx

2の累乗ではないテクスチャ対応

たとえば100x150のグラフィックからテクスチャを作ろうとすると、ビデオカードによってはテクスチャサイズは2の累乗に補正されてしまうので(この場合128x256)、このまま何も考えずに使うとおかしなことになる。
ので、頂点フォーマットのD3DFVF_TEX1を、128x256のテクスチャから100x150の部分だけ描かれるようにうまいこと設定したらうまくいきました。

ただこれは無駄な領域が多くかなり贅沢なやり方で、本当は

  • 2の累乗サイズのテクスチャ数枚に切り出して並べて一枚に描画する
  • 大きな画像に複数のグラフィックをまとめて、プログラム側で切り出して使う

といった方法をとるらしいですが、面倒くさそうなのでまた今度調べます。

回転拡大縮小

座標変換済み頂点を使うとワールド変換による回転拡大縮小ができない。ので、板ポリゴンの4頂点それぞれに対して、行列などを使って自前で回転拡大縮小後の座標を計算する必要がある?

まあこれはD3DXMatrixScalingやD3DXMatrixRotationZを使えば簡単にできるけど、これが普通のやりかたなのかどうかが心配です。