« カテゴリ名変更 | メイン | 作り始めようとするが…… »

2007年03月19日

吉里吉里 DirectX拡張:: どうやって2Dを描画するか

    

Direct3Dで2Dを描画する場合、次のような方法が思いつく。

1. 四角いポリゴンにテクスチャとして貼って表示。頂点はT&L済みにする。
2. 四角いポリゴンにテクスチャとして貼って表示。頂点はトランスフォーム前のにする。
3. ソフトで合成して、IDirect3DDevice9::UpdateSurfaceでコピー。
4. IDirect3DDevice9::StretchRectだけでコピー。

2D画像を描画する場合、当たり前だけど、元画像の 1pixel を画面の 1pixel に対応させる必要がある。
これが案外面倒。
テクスチャ座標は、そのまま表示するのなら 0.0 ~ 1.0 で表すことになると思うが、テクスチャが2の累乗値しか許可されていない場合、それ以外の値の幅の画像を描画しようとしたら、1ドットだけ拡大されてしまい見難い絵になってしまうこともありえる。
また、ポリゴンのどの部分が実際に描画され、どの部分は描画されないのかも気にかける必要がある。
以上のようなことを考えると、トランスフォーム前の頂点座標を与えて綺麗に表示する ( 2番 ) のは、変換時の誤差まで考えなくてはならないので、難しいのではないかと推測できる。
そんな関係で、以前は1番で実装していた。
ただ、3D的な演出 (ガラスが割れて崩れ落ちるようなものなど) への切り替えを考えると、2番も考慮しておいたほうが良いと思われる。(普段は必要ないので、1番でいいと思うが)
3番は、DirectX使うメリットが少ない。何でも出来るとも考えられるが。
4番は、拡大縮小のコピーしか出来ないのと、コピーできるサーフェイスのタイプにいろいろと制限がある。でも、ほとんどの場合、これで事足りるのではないだろうか。
ちなみに、動画のVMRモードではStretchRectでバックバッファへコピーしています。コピー時のYUV から RGBA への色空間の変換はサポートされている ( サポートされないデバイスもある模様 ) ので、色空間変換が必要な場合は、CPU負荷が軽くなって助かります。画像の色空間変換はかなり重いので。

D3DX を使うのなら、ID3DXSprite を使えば深く考えなくても良さそう。ID3DXSprite は使ったことがないので、その内試してみたい。
でも、ヘルプを見たところ少し凝ったことをしようとすると、ID3DXSprite では対応出来なさそうな気もする。

そんな感じなので、1~4をすべてサポートして、うまくやってくれるようなのがいいな。
とりあえずは、そこを目指そう。



投稿者 Takenori : 2007年03月19日 01:08




comments powered by Disqus
Total : Today : Yesterday : なかのひと