0

DynamicVertexBuffer について読み、頻繁に変更されるデータに対してどのように優れているかを読みました。立方体で構築された世界があり、立方体の頂点をこのバッファーに格納して、それらを画面に描画する必要があります。

ただし、すべての立方体に頂点があるわけではなく (一部は透明な空気です)、立方体のすべての面を描画する必要もありません (互いに向き合っています)。バッファ?また、特定の面、つまり透明な面 (ガラスや葉など) を最後に描画する必要があり、これらの面も、アルファ ブレンディングを台無しにしないように後ろから前の順序で描画する必要があります。

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

また、頂点の数は変更できますが、サイズをまったく変更できないため、DynamicVertexBuffer はあまり動的に見えません。顔を追加または削除する必要があるたびに、バッファを再作成する必要がありますか?

4

1 に答える 1

4

間違った方法でこれに取り組んでいるように聞こえます-世界に些細な数以上のキューブがあると仮定します。世界 (およびその立方体) をカスタム データ構造に格納する必要があります。これにより、特定の方向を見たときに、特定のポイントから世界のルールに基づいてどの立方体 (および面) が表示されるかを迅速に判断できます。

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

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

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

最後のヒント - 頂点バッファーのバッチを生成すると言うときは、GPU の状態の変化を最小限に抑える方法 (同じテクスチャ、同じシェーダーなど) でキューブをまとめてバッチ処理することを意味します。GPU の状態への変更を最小限に抑えることが、レンダリングを最適化するための鍵となります。最初に、レンダリングから面をカリングしてできる限りのことを行った後です。

于 2011-01-15T23:10:10.617 に答える