0

2D ゲームでは、フレームごとに多くのテクスチャ付きクワッドを描画する必要があります。それらは頂点を共有しておらず、フレームごとに変化するランダムな位置を持つと見なす必要があります。私はopengl 3+を使用しているため、クワッドを使用できなくなりました(削除されました)。代わりに 2 つの三角形を使用して各クワッドを作成することもできますが、これにより、フレームごとに GPU に渡される冗長な再利用データが大量に作成されます。それで、私の目標を達成するための最良の方法は何だろうと思っていましたか?

ジオメトリ シェーダーを作成し、四角形の左上のポイントと、幅、高さ、テクスチャの位置を単純に渡すことができます。その後、シェーダーは 2 つの三角形を作成できます。しかし、これはかなり遅いと思いますか?

4

1 に答える 1

2

2つの方法があります。

  • (ストリップではなく)トリリストを使用します。変換を使用しようとすると非常に遅くなり、正方形がたくさんない限り、データはそれほど重くなりません。心配な場合は、頂点フォーマットを最適化して、1バイトあたり8バイトまたは16バイトに減らすことができます。PCIe 2.0 x16はギガバイト/秒の帯域幅であり、パーティクルシステムなどには数メガバイトが妥当であることを忘れないでください。ワークロードによっては、インデックスが役立つ場合があります。
  • インデックスが付けられ、バッファ内にある三角形の1つまたは小さなバッチを使用し、シェーダーを使用してそれらを再配置します。これは、バッチ処理(一連の座標で100の正方形を描画し、シェーダーで座標を更新し、再度描画する)を利用してメモリを節約しますが、深さ(シェーダーで処理する)やその他の詳細について心配する必要があります。これまでで最悪の事態ではなく、それが良いかどうかははっきりとは言えません。

おそらく、ジオメトリシェーダーは使用しないでください。通常、すべてのフレームで実行することを意図しているわけではありませんが、実行することはできます。いくつかの利点があります。特に、使用されているメモリ帯域幅はごくわずかですが、ハードウェア要件は大幅に高く、APIははるかに厳格です。データがそこで最適化できるCPU計算からのものである場合は、パフォーマンスが向上する可能性もあります。せいぜい、計算を変換するか、データをビデオメモリにダウンロードする必要があります。

正方形ごとに2つを意味する場合を除いて、ジオメトリシェーダーから2つの三角形を計算することは絶対に避けてください。シェーダーの主な利点は並列処理であるため、できるだけ多くの正方形を実行して、それらを大きなバッチで描画する必要があります。ほとんどの場合、バッチ処理によってパフォーマンスが向上します。これを行うにはさまざまな方法があります。APIで変換を変更するようなことは、非常に遅く、回避するのが最善です(3.0以降を使用している場合は、おそらくそれほど問題にはなりませんが、以前は大きな問題でした)。

于 2013-02-10T00:17:51.400 に答える