通常、複数の VBO を使用する代わりにインターリーブされた VBO を使用すると、速度が向上します。これは、VAO を使用する場合にも有効ですか?
位置用の VBO と法線用などの VBO を持つ方がはるかに便利だからです。複数の VAO で 1 つの VBO を使用できます。
通常、複数の VBO を使用する代わりにインターリーブされた VBO を使用すると、速度が向上します。これは、VAO を使用する場合にも有効ですか?
位置用の VBO と法線用などの VBO を持つ方がはるかに便利だからです。複数の VAO で 1 つの VBO を使用できます。
VAO
より大きなデータ セットを共有するには、単一の頂点 (attrib) 配列を含む専用バッファーを使用するのが確実ですが、特定の配列を別のバッファーにインターリーブし、VAO を使用してそれらを結合することもできます。
VAO は、これらすべてのバッファーと、配列バッファー バインディングや (バッファー) ポインターと有効/無効フラグを使用した属性エントリなどの頂点 (属性) 配列状態のバインディングを処理します。利便性は別として、面倒な属性配列の有効化と無効化を行うことなく、すべての状態を一度に変更する単純な API 呼び出しは言うまでもなく、このジョブを迅速に実行できるように設計されています。基本的には、以前は手動で行わなければならなかったことを行います。しかし、私自身の VAO のような実装では、多くのバインドを行った場合でも、パフォーマンスの低下を測定できませんでした。私の見解では、主な利点はその利便性です。
そのため、VAO は glDraw* に関して描画パフォーマンスを決定しませんが、状態変更のオーバーヘッドに影響を与える可能性があります。
インターリーブされたデータ形式...
...単一の頂点の頂点座標と属性がメモリ全体に散らばっていないため、GPU キャッシュの負荷が軽減されます。それらはいくつかのキャッシュ ラインに連続して適合しますが、散在する属性はより多くのキャッシュ更新を引き起こし、したがってエビクションを引き起こす可能性があります。メモリの場所が離れているため、最悪のシナリオでは、キャッシュ ラインごとに一度に 1 つの (属性) 要素になる可能性がありますが、頂点は非決定論的/非連続的な方法でプルされ、予測やプリフェッチが開始されない可能性があります。GPU は非常にこの点でCPUに似ています。
...また、互換性のあるデータ ソースのデータセットをマッピングされた GPU メモリに直接読み込むことができる、非推奨のインターリーブ形式を満たすさまざまな外部形式にも非常に役立ちます。まさにこれらの理由から、現在の API でこれらのインターリーブ形式を再実装することになりました。
...単純な配列と同様に、配置に適したレイアウトにする必要があります。さまざまなサイズ/アライメント要件を持つさまざまなデータ型を混在させるには、GPU と CPU に適したパディングが必要になる場合があります。これは、より難しい実装を除けば、私が知っている唯一の欠点です。
...共有のために単一の属性配列を指すことを妨げないでください。
インターリーブにより、おそらく描画パフォーマンスが向上します。
結論:
私が経験したことから、VAO ファクトリを適切にカプセル化できる、頂点データ ソースと「コンパイルされた」VAO 用のきれいに設計されたインターフェイスを持つことが最善です。その後、このファクトリを変更して、インターリーブされた個別の頂点バッファー レイアウトまたは混在した頂点バッファー レイアウトをデータ ソースから初期化できますが、何も壊すことはありません。これは、プロファイリングに特に役立ちます。
せせらぎの後、私のアドバイスは単純です。最適化の前と最適化のために、適切で十分に抽象化された設計です。