2011-01-15 11 views
0

私はDynamicVertexBufferについてよく読んでおり、頻繁に変更されるデータの方がより良いと思われます。私はキューブによって構築された世界を持っており、キューブの頂点をこのバッファに格納して、それらを画面に描画する必要があります。XNA 4.0でDynamicVertexBufferを使用

しかし、すべてのキューブが頂点を持っているわけではありません(一部は空気で透明です)。キューブのすべての面がどちらかの面を向いているわけではありません(どうして向かい合っているか)。バッファにどこに格納されますか?また、特定のフェースは最後に描画する必要があります(つまり、ガラスや葉のような透明なもの)。また、これらのフェースは、アルファブレンディングを台無しにしないように、バックツーフロントで描画する必要があります。

これらの頂点がすべてこのバッファに任意に格納されている場合、どの頂点がどこにあるのかをどのように知ることができますか?

また、頂点の数は変わる可能性がありますが、DynamicVertexBufferは私のサイズを全く変更することができないので、私にとって非常に動的ではありません。顔を追加または削除する必要があるたびにバッファを再作成する必要がありますか?

答えて

3

あなたが間違った方法でこれに近づいているように聞こえます。あなたの世界には些細な数のキューブ以上のものがあると仮定します。あなたは、カスタムデータ構造に世界(とそのキューブ)を保存して、与えられた方向を見ているときに与えられた点からあなたの世界のルールに基づいてどのキューブ(そして顔)が見えるかを素早く判断できるようにしてください。

シーンをレンダリングするたびに、これらの面だけの頂点バッファのバッチが生成されます。したがって、世界のジオメトリ全体を格納するための基礎として頂点バッファを使用しないでください。頂点バッファはレンダリングツールであり、ワールドシーングラフツールではありません。

これらの大規模な可視性の問題は、GPUよりもはるかに高速なコードで実行されます。たとえば、+ xを見ている起点に座っている場合は、-ve x方向のすべての立方体を直ちに無視できますが、これは非常に単純な例です。

oct-treeレンダリングのより完全な例の検索については、この種のレンダリングは、あなたの世界のレイアウトに非常によく合います。

最終的なヒント - 頂点バッファのバッチを生成するとは、GPUの状態の変化を最小限に抑える方法でキューブをまとめることです(同じテクスチャ、同じシェーダなど)。 GPUの状態を変更することを最小限に抑えることは、レンダリングを最適化するための鍵です。

+0

「あなたは-ve x方向のすべての顔を無視する」という意味だと思います。とにかく、この情報をありがとう。テクスチャはすべて同じテクスチャマップから取得されるため、問題はありません。しかし、私は世界にキューブを追加すると言うと、このキューブはどこかに置かれてレンダリングが必要です。頂点はどこに追加しますか?他のすべての頂点が格納されている場所のサイズを変更することなく、この新しいキューブについてGPUにどのように通知できますか?私はoctreeのレンダリングを調べるでしょう、私はquadtreesとoctreeを見てきました。 – Bevin

+0

キューブは、面よりもデータ構造のレベルが高いと仮定して、-ve x方向のすべての立方体を無視するという意味でした。キューブを無視することができれば、自動的に6つの顔をすべて無視することができます。そのため、キューブを先にドロップするほうが簡単です。潜在的に目に見えるキューブを設定すると、顔をドロップしようとします。 –

+1

あなたはまだフレーム間で永続的なものとして頂点バッファを考えています。ほとんどのエンジンではそうではありません。フレームごとに頂点バッファをゼロから作成します。確かにスペースを割り当てることができますが、データを再構築します。潜在的に目に見える顔のセットは、すべてのフレームで変更されます。考えてみると、何百万ものキューブを持つ世界があるかもしれませんが、できるだけ多くの顔をレンダリングしたい各フレーム(おそらく数百という)は、頂点バッファのサイズを可能な限り小さくすることですフレーム。 –

関連する問題