« 作り始めようとするが…… | メイン | どうやって3Dと2Dを混ぜるか »

2007年03月19日

吉里吉里 DirectX拡張:: 描画のソート

    

前後関係を持ったものを描画する場合、どのように描画するのが得策か。
Direct3Dを使って描画するのであれば、次の2つが考えられる。

1. 一番後ろのものから順に描画していく
2. Zバッファを使う

一番後ろのものから順に描画していった場合、当然だが重なり面が大きければ大きいほど無駄に描かれる面が出来てしまう。
しかし、2Dに限るのであれば、そんなに重なることはないように思う。
それに、ハードウェアで重ねるのであれば、多少はオーバーヘッドがあっても、今のビデオカードなら難なくこなしてくれるだろう。
ただ、3Dの場合は、あるポリゴンが他のポリゴンに刺さっているような場合うまく描画されない。

Zバッファを使った場合、半透明のものを描画しないのであれば、ソートなど気にせずZ値を与えて、適当に描画すればとりあえずは前後関係に従って描画される。
半透明のものを描画しようとした場合は、描画順を気にしないと期待した結果が得られない。
描画したオブジェクトが半透明であっても、そのオブジェクトのZ値はZバッファに書かれてしまう。Zバッファに書かれるということは、それ以後、それより後ろのオブジェクトは描画されないことになる。
その結果、後ろの絵と半透明のオブジェクトの合成を期待したにもかかわらず、背景色と合成された絵が出てきてしまうこともありえる。
これを避けるためには、オブジェクトを後ろから前へ描画する必要がある。
しかし、ただ単純にそのようにすると明らかに無駄が多い。
半透明のオブジェクトの前に不透明のオブジェクトがあったら、半透明のオブジェクトは描かなくていいはずだ。
このことから、まず不透明のオブジェクトを手前から後ろへ描画し、次に半透明のオブジェクトを後ろから手前へ描画するのが効率的だろう。
そのようにすれば、Zテストによって見えないところは描画されなくなる。
たぶん、この方法が一般的。

で、仮にZバッファを使うことにしたとする。
では、Z値はどのように決めればよいのだろう?
とりあえず、1/(2^8) ぐらいずつずらしておけばいいだろうか?
それとも、適当な間隔をあけて値を入れおけばいいだろうか?
適当な間隔をあけて値を入れるのもありだが、そんな面倒なことはやりたくない。
単純に順序のみ保持しておき、描画の直前にZ値の精度から重ならないように少しずつ値をずらして設定し、半透明、不透明に分けてソートしてから描画するのが良さそうだ。
でも、Zバッファを使うことにした場合、3Dと同時に描画したくなった場合、どうするか考えないといけない。
3Dのオブジェクトに、2Dの絵が突き刺さると格好悪い。
では、やはりZバッファを使うのではなく、描画順で描いた方が良いのだろうか?
どうやって3Dと2Dを混ぜるかへつづく



投稿者 Takenori : 2007年03月19日 22:15




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