[DirectX9]行列とドット絵[備忘録]

がっこの課題でDirectX9を触っているので、この前の土日の備忘録

・行列
DirectX9では行列ヘルパ関数があり、固定機能パイプラインなるものを通して、設定された頂点が設定された行列変換されます。

この時、行列変換の対象となるのは変換済みでない頂点になります。
自前で計算しない限り、変換済みの頂点なんてないと思いますが、頂点フォーマットでXYZRHWを指定している場合は別です。
その頂点フォーマットの頂点は、変換済みと見なされ、行列が全く適用されません
これに気付くのに4時間掛かりました。

・ドット絵
そんなわけで、めでたく行列変換が可能になったんですが、今度はテクスチャのドット絵がボヤける問題が。

これの解決方法は

1.テクスチャの拡縮時の補正をD3DTEXF_POINTにする

pD3DDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT ); // テクスチャ拡大時の補間設定
pD3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT ); // テクスチャ縮小時の補間設定

2.テクスチャ生成時、画像補正をD3DX_FILTER_POINTにする

D3DXCreateTextureFromFileEx( pDevice, szFilepass, m_nTexWidth, m_nTexHeight, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT,D3DX_FILTER_POINT, D3DX_FILTER_POINT, 0, NULL, NULL, &m_pTexture

3.テクスチャ生成時、テクスチャのサイズを画像サイズより大きい最小の2のべき乗の数にする
4.描画時、変換済み頂点の座標を(-0.5,-0.5,0.0)ずらす

の4つです(おいらの環境では)

変換済みの頂点をずらすのは、移動行列に渡す座標を加工すれば出来ました。

ただ、テクスチャのUV座標を弄る場合、頂点のロックが入るので、少し重くなります。一つの画像にスプライトをまとめている時のゲームの動作を最適化する時は考えものです。
ドット絵は自前で行列変換を行い、DrawPrimitiveUPで描画が良いのでしょうか。

・結論
DirectX9でドット絵、というか2Dゲームはめんどくさすぎです。他にいろいろ手段がある現在、無理して生のDirectXを触って2Dゲーム作るのは、モチベーションのコストパフォーマンスが悪いです。
少なくとも、行列ヘルパ関数とドット絵は共存は出来ないでしょう。

おいらがよく見に行くまるぺけさんのサイトでは、自作シェーダを使っていました。
その3 スクリーン座標にテクスチャの一部を2D描画する仕組み

・これからのプログラミングについて
DirectXに「普通これすれば、こうなるだろう」という、理想の動きを全く期待しないほうがいいので、デバッグ作業はトップダウンで。いろいろ弄る前に、自分のコードでのDirectXの設定と、DirectXについての解説しているサイトをみまくる。

・参考サイト
DirectXにおける2D描画

DrawPrimitive周り

続きを読む

スポンサーサイト
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
プロフィール

ぴお

Author:ぴお
ようこそ

自分のゲーム制作での備忘録や製作記録を書き留めておくブログです。

■やってるサービス
Twitter:piorimumu

Pixiv
http://www.pixiv.net/member.php?id=1126385

Twitter
このページのトップへ