頂点バッファオブジェクトがパフォーマンスを向上させるのはなぜですか?


10

私の基本的な理解から、頂点バッファーオブジェクトは次のように機能します(擬似コード)。

通常、正方形を描くと言いたい場合は、線の描画コマンドを発行できます。

line (0, 0) -> (1, 0)
line (1, 0) -> (1, 1)
line (1, 1) -> (0, 1)
line (0, 1) -> (0, 0)

VBOを使用すると、私が正しく理解していれば、頂点をVBOにロードします。

define VBO
load (0,0) -> VBO
load (1,0) -> VBO
load (1,1) -> VBO
load (0,1) -> VBO
load (0,0) -> VBO

その後、1つの描画コマンドを発行できます。

draw VBO vertices

VBOのしくみは理解していますが、なぜパフォーマンスが向上するのかはわかりません。

彼らはどのようにパフォーマンスを改善しますか?

回答:


11

一般に、イミディエイトモードでオブジェクトをレンダリングするとき(たとえば、線の描画コマンドを発行するとき)は、グラフィックカードに送信して描画する一連のコマンドを作成します。大量のデータを描画している場合、または非常に頻繁に描画している場合は、このデータを何度も繰り返し送信することに多くの時間を費やす可能性があります。

頂点バッファを使用すると、グラフィックスカードに一度送信する単一のオブジェクトを生成できます。ジオメトリを変更する必要がない場合は、それをグラフィックスカードに残して、グラフィックスカードにそのオブジェクトの描画要求を送信するだけです。描画するたびにコピーが回避されるため、描画ごとのオーバーヘッドがはるかに少なくなります。

頂点バッファオブジェクトを使用しても、必ずしも非常に高速になるとは限らないことに注意してください。オブジェクトをフレームごとに1回だけ描​​画し、各フレーム間でジオメトリを置き換える場合、各フレームのコピーを回避することの利点は得られません。

私の経験のほとんどはOpenGLのようなグラフィックAPIを使用してプログラムを作成することから来ているため、グラフィックドライバーのバックエンドに慣れていない人はおそらくより詳細な答えを提供できますが、これにより状況が少し明確になることを願っています。


10

VBOを即時モードよりも効率的にする2つのステップがあります。

  1. 即時モードglBegin / glEndglVertex *など)は、各フレームで、頂点、属性ごとの属性(位置、法線、色など)をドライバーにスプーンフィードして、ドライバーを再フォーマットし、最後に送信することを意味しますGPUへのコマンドとしてのパッケージ全体。各フレームの頂点ごとの多くの関数呼び出し。
    即時モードはOpenGL 3.0以降非推奨であり、3.2から完全に削除されていること注意してください。)

  2. 使用して頂点配列を(参照glDrawArraysglDrawElementsglVertexPointerなど、)、一度にドライバに全体のことを与え、それに頂点を再フォーマットの負担を節約することができます。メッシュ全体のほんの一握りの呼び出しによって、頂点ごとのいくつかの関数呼び出しを効果的に置き換えています。ただし、フレームごとにこれを行う必要があります。

  3. Vertex Buffer Objectまたは VBO glGenBuffers glBindBufferなどを参照)はさらに一歩進んで、GPU側にデータを保存します。一度だけ送信し、ハンドルで参照するだけです。各フレームで同じデータを繰り返し送信しないことで、帯域幅を節約できます。


6

イミディエイトモードインターフェイス(たとえば、古いスタイルのOpenGL glBegin()/ glEnd()/ glVertex())を使用することで、一度に1つずつ効果的にデータをドライバーにドリップフィードできます。次に、その単一のデータを取得して再フォーマットし、ハードウェアに渡す必要があります(最近では、コマンドバッファーに入れることを意味します)。

頂点バッファーオブジェクトを使用することで、ドライバーに(必要に応じて)大きなデータブロックを提供して、それを使用する必要がある前に提供します。多数の最適化(再フォーマット、ビデオメモリへの配置)を実行できるだけでなく、GPUを段階的に供給する必要もありません。

実際には、プリミティブの数が少ない場合は、それほど大きな違いはありませんが、数百万の三角形メッシュを描画する場合は、ビデオメモリ内のVBOが適しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.