5

CPUからGPUに送信されるデータを最小限に抑えるため、頂点の位置や色などを1つの配列にインターリーブするという提案を一般的に指摘する他の質問を読み、見ました。

私がはっきりしていないのは、インターリーブされた配列を使用しても、位置ポインターと色ポインターに対して個別の GL 呼び出しを行う必要がある場合に、OpenGL がこれを行う方法です。両方のポインターが同じ配列を使用し、その配列内の異なるポイントで開始するように設定されている場合、2 つの異なるポインターのオブジェクトであるため、描画呼び出しは配列を 2 回コピーしませんか?

4

3 に答える 3

6

これは主にキャッシュに関するものです。たとえば、4 つの頂点と 4 つの色があるとします。この方法で情報を提供できます (すみませんが、正確な関数名は覚えていません)。

glVertexPointer(..., vertex);
glColorPointer(..., colors);

内部で行うことは、頂点 [0] を読み取り、次に色 [0] を適用し、次に頂点 [1] に色 [1] を適用することです。ご覧のとおり、頂点の長さがたとえば 20 メガバイトの場合、頂点 [0] と色 [0] は少なくとも 20 メガバイト離れています。

一方、{ vertex0, color0, vertex1, color1, etc.} のような構造を提供すると、多くのキャッシュ ヒットが発生します。これは、vertex0 と color0 が一緒であり、vertex1 と color1 も一緒であるためです。

これが質問への回答に役立つことを願っています

編集: 2 回目の読み取りでは、質問に答えていない可能性があります。おそらく、OpenGL がその構造体から読み取る値をどのように認識しているのか疑問に思われるかもしれません。{ vertex, color, vertex, color } のような構造で前に言ったように、頂点が位置 0 で、オフセットが 2 であることを OpenGL に伝えます (つまり、次のものは位置 2、次に 4 などになります)。位置 1 から始まり、オフセットも 2 です (つまり、位置 1、次に 3 など)。

追加: より実用的な例が必要な場合は、このリンクhttp://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_(VBO)を参照してください。バッファを一度だけ提供し、オフセットを使用して効率的にレンダリングする方法を確認できます。

于 2013-01-26T09:13:02.967 に答える
4

読むことをお勧めします: Vertex_Specification_Best_Practices

h4lc0nは非常に素晴らしい説明を提供してくれましたが、追加情報を追加したいと思います。

  • インターリーブされたデータは、データが頻繁に変更される場合、実際にはパフォーマンスを低下させる可能性があります。たとえば、ポイント スプライトの位置を変更すると、POS が更新されますが、COLOR と TEXCOORD は通常同じです。次に、データがインターリーブされると、追加のデータに「触れる」必要があります。その場合、1 つの VBO を POS のみ (または一般的に頻繁に変更されるデータ) に使用し、2 つ目の VBO を一定のデータに使用することをお勧めします。
  • VBO レイアウトはベンダー/ドライバー固有であるため、VBO レイアウトに関する厳密な規則を定めることは容易ではありません。また、あなたの使用法は他の人とは異なる場合があります。一般に、特定のテスト ケースに対していくつかのベンチマークを作成する必要があります。
于 2013-01-26T12:08:26.647 に答える
0

異なる属性を分離するための議論をすることもできます。GPUが次々に頂点を処理するのではなく、それらの束(例:16)を並列に処理すると仮定すると、頂点シェーダーの実行中に次のようなものが得られます。

  • 16個の頂点すべての属性Aを読み取ります
  • いくつかの計算を実行します
  • 16個の頂点すべての属性Bを読み取ります
  • さらにいくつかの計算を実行します
  • ...。

したがって、一度に多くの頂点に対して1つの属性を読み取ります。この理由から、属性をインターリーブすると実際にパフォーマンスが低下するように思われます。当然のことながら、これは、帯域幅に制約がある場合、または何らかの理由でメモリレイテンシを隠すことができない場合にのみ表示されます(たとえば、多くのレジスタを必要とする複雑なシェーダーは、特定の時間に飛行できる頂点の数を減らします) 。

于 2013-01-26T12:34:13.053 に答える