1

複数の 2-D 形状をサーフェスにレンダリングし、ユーザーがこれらの形状を操作できるようにする DirectX 9.0 コントロールを作成しようとしています。これまでのところ、さまざまな色の 100 万個の三角形をグリッドにレンダリングすることができました。ユーザーはマウスを使用して、このグリッドをパンおよびズームできます。しかし、待ってはいけません..私はこれを非効率的な方法で行っていることを知っています... 現在

、各三角形の頂点バッファがあり、レンダリングごとにストリームソースを設定し、プリミティブをジャイアントに描画します-ループ。実験として、1 つの三角形を含む頂点バッファーを作成してみました。別の for ループで、ワールド トランスフォームを変更してプリミティブを描画しました。パフォーマンスはひどかった。

私が本当に必要としているのは、いくつかのユニークな形状 (約 100) を保存し、それらを世界中で 1,000 回または 10,000 回以上スタンプする方法です。また、形状の単一インスタンスの色を変更できるようにしたいと考えています。派手な照明/テクスチャ/またはそのようなものは必要ありません。シンプルな色ばかり。

では、これを実現するための典型的な DirectX の方法は何ですか?

4

1 に答える 1

1

これに使用できるテクニックがいくつかあります。インデックス バッファーを調べることから始めて、シーンがより複雑になるにつれて、インスタンス化のサポートなどに移行します。

巨大な頂点とインデックス バッファーを生成し、インデックス バッファーを使用して、バッファーからどの頂点を使用するかを指示します。頂点バッファー内の重複する頂点の量を減らすように最適化することもできますが (オーバーラップが多い場合)、単純な実装でも高速になるはずです。

多数の変換された形状をレンダリングする場合、頂点シェーダーを使用すると、並列処理するように設計されたデバイスに処理の負荷を軽減することができます。

固定機能パイプラインの代わりにシェーダーを使用すると、最終的にラスター化されたときにピクセル シェーダーで何をすべきかを GPU に伝えるために、各頂点と共に情報を渡すことができます (おそらく、Z 値またはテクスチャ座標でエンコードします)。画面 (プリミティブの色を変更するなど)。

いずれにせよ、状態を「非同期」にするたびにペナルティを支払うため、GPU との間で送受信する回数を大幅に減らすことを目指しています。たとえば、変換を変更した場合などです。多くの場合、フレーム中に大量の小さな塊を送信するよりも、フレームごとに 1 回大きな塊をカードに送信する方が高速です。

于 2012-05-07T22:44:05.560 に答える