« 描画のソート | メイン | テクスチャ ブレンディング »

2007年03月21日

吉里吉里 DirectX拡張:: どうやって3Dと2Dを混ぜるか

    

描画のソートのつづき。

Zバッファを使って、前後に2Dを置き、中間に3Dを描くのであれば、ViewportでMinZとMaxZを設定し、トランスフォーム後のZ値の範囲を2Dで使う範囲とずらすことで可能。
つまり、トランスフォーム後の頂点で描画する2Dには、0.0~0.1、0.9~1.0などの範囲を使うようにして、3Dはその間の0.1~0.9を使う。
ただ、その場合は3Dで使えるZ値が狭まってしまうのが少しやっかい。

Viewportで範囲を狭める以外に、レンダリングターゲットにテクスチャを設定し、2Dはそこにレンダリングしておき、最後にそのテクスチャを貼り付けた板状のポリゴンを後ろと手前に描く事でも混ぜることは出来る。
他には、途中でZ値をクリアしてしまうという手もある(うまく行くのかどうかは知らないが)。

でも、本当にそこまで必要だろうか?
やはり、混ぜて使うことを考えると2Dは描画順で制御したほうが良いようにも思う。
ただ、2Dのみで使われる場合に少しだけ不利なのと、フォグやパーティクルなどの間に2Dを置きたい場合に困る。
ならば、間の3Dの中に2Dを置けるようにしてしまえば、両方の問題が解決するのでは?

つまり、以下のような構成にする。

1. 最前面2D層 ( 描画順で制御される )
2. 3D層 (T&L済み、T&L前頂点の両方あり)
3. 最背面2D層 ( 描画順で制御される )

1と2の2D層は、描画順で制御される。2はZ値で重なりが制御される。
2の中に2Dを描画する場合、T&L済み頂点を与えるか、カメラからの距離を与えて内部で適切なZ値に計算する。
重なり順だけを与えたなら、内部でT&L済み頂点にして、意図した重なりで描画されるようにする。
3Dと混ぜたい時は、距離を与えてうまく混ざるようにする。
2Dしか使わないのであれば、1と3は使わずに、2だけで描画すれば、無駄な描画が減って効率的。

内部的には、3を描画する必要がある場合はZテストとZバッファの書き込みをOFFにして、3を描画。
次にZテストとZバッファの書き込みをONにして、2を描画。
最後に、1を描画する必要がある場合は、再びZテストとZバッファの書き込みをOFFにして、1を描画するようにすれば、期待した通りに動くはず。
もっとうまいやり方があるかもしれないが、とりあえずこれで行こう。



投稿者 Takenori : 2007年03月21日 20:33




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