最新の OpenGL (3.x+) では、位置、色、法線、テクスチャ座標、およびインデックスなどの頂点属性を含むバッファー オブジェクトを作成します。
次に、これらのバッファーは、対応する頂点配列オブジェクト (VAO)に割り当てられます。VAO には、基本的にすべてのデータとデータの形式へのポインターが含まれています。
VAO の作成方法と使用方法については、多くのチュートリアルがあります。残念ながら、大規模なアプリケーションやゲームで VAO をどのように使用すべきかは明確ではありません。
たとえば、ゲームには多くの 3D モデルが含まれる場合があり、各モデルを異なる VAO で分離することが適切と思われます。
一方、パーティクル システムには、互いに独立して移動する多くの切断されたプリミティブが含まれています。このシナリオでは、システムごとに 1 つの VAO を使用すると、CPU-GPU 転送のパフォーマンスが向上する可能性があります。ただし、この場合、プリミティブは互いに異なる方法で変換する必要があるため、各パーティクルを非常に小さな VAO に分離することが実行可能に見えるかもしれません。
質問:
- 大量の小さなデータ セット (クワッドのパーティクル システムなど) の場合、すべてのデータを 1 つの VAO にパックするか、多数の VAO に分割する必要がありますか? 各方法のパフォーマンスの利点/欠点は何ですか?
1 つの VAO が使用されると仮定すると、データの独立した各サブユニットを変換する唯一の明らかな方法は、実際の位置情報を変更して GPU に再ロードすることです。これを何度も行うと、時間パフォーマンスの点でコストがかかります。
多くの VAO が使用されていると仮定すると、GPU は各 VAO の重複したフォーマット情報を保存する必要があります。これはスペースの点でコストがかかるようです (ただし、これが必ずしも遅いかどうかはわかりません)。
補足:
はい、私は個人的に粒子システムの管理に興味があります。この質問をより一般的なものにし、他の人にとってより役立つようにするために、VAO 管理全体について質問しています。保存するデータの種類と、求められるパフォーマンスの種類 (時間/空間) を考えるとき、どのような管理方法が適切であるかを知りたいと思います。
VAO の作成については、こちらで詳しく説明しています。