2つの方法があります。
- (ストリップではなく)トリリストを使用します。変換を使用しようとすると非常に遅くなり、正方形がたくさんない限り、データはそれほど重くなりません。心配な場合は、頂点フォーマットを最適化して、1バイトあたり8バイトまたは16バイトに減らすことができます。PCIe 2.0 x16はギガバイト/秒の帯域幅であり、パーティクルシステムなどには数メガバイトが妥当であることを忘れないでください。ワークロードによっては、インデックスが役立つ場合があります。
- インデックスが付けられ、バッファ内にある三角形の1つまたは小さなバッチを使用し、シェーダーを使用してそれらを再配置します。これは、バッチ処理(一連の座標で100の正方形を描画し、シェーダーで座標を更新し、再度描画する)を利用してメモリを節約しますが、深さ(シェーダーで処理する)やその他の詳細について心配する必要があります。これまでで最悪の事態ではなく、それが良いかどうかははっきりとは言えません。
おそらく、ジオメトリシェーダーは使用しないでください。通常、すべてのフレームで実行することを意図しているわけではありませんが、実行することはできます。いくつかの利点があります。特に、使用されているメモリ帯域幅はごくわずかですが、ハードウェア要件は大幅に高く、APIははるかに厳格です。データがそこで最適化できるCPU計算からのものである場合は、パフォーマンスが向上する可能性もあります。せいぜい、計算を変換するか、データをビデオメモリにダウンロードする必要があります。
正方形ごとに2つを意味する場合を除いて、ジオメトリシェーダーから2つの三角形を計算することは絶対に避けてください。シェーダーの主な利点は並列処理であるため、できるだけ多くの正方形を実行して、それらを大きなバッチで描画する必要があります。ほとんどの場合、バッチ処理によってパフォーマンスが向上します。これを行うにはさまざまな方法があります。APIで変換を変更するようなことは、非常に遅く、回避するのが最善です(3.0以降を使用している場合は、おそらくそれほど問題にはなりませんが、以前は大きな問題でした)。