頂点バッファーオブジェクトの主な用途は何ですか?


8

私が読んだことから、VBOは純粋にパフォーマンスを目的としているようです。

私はlwjglの非常に初歩的な学習プロジェクトに取り組んでいます。ライブラリのさらに高度な機能と、それらの用途を理解しようとしています。

私の理解では、VBOを使用すると、頂点が現在シーンに描画されていない間でも、VRAMに頂点を保持できます。私の場合、クワッドを描画しているだけで、パフォーマンスはおそらくまったく問題ではありませんが、内部で何が起こっているのかをまとめようとしています。クワッドを直接描画している場合、CPUメモリから描画していますか?また、可視性のチェックを行わない場合、それが表示されているかどうかに関係なく、「シーン」内のすべてを完全にレンダリングしていることを意味しますか?VBOはオブジェクトを格納し、必要なものだけをレンダリングする方法ですか?

回答:


10

Pedantic note: OpenGLには、「Vertex Buffer Object」のようなものはありません。単にバッファオブジェクトがあります。バッファオブジェクトは、割り当て、データの入力、読み取り、さまざまな方法での使用が可能なGPUメモリの線形配列です。あなたができることの一つやるバッファオブジェクトには、それらの中に格納する頂点データであるとレンダリングのためのソースアレイとしてそれらを使用しています。しかし、にもかなりの用途があります。

バッファーオブジェクトは、錐台カリングやその他のシーングラフスタイルの構成を回避する方法ではありません。頂点データに使用する場合、バッファーオブジェクトは単に頂点データを格納します。それらがない場合、glDrawElements/Arrays/etc呼び出しはCPUメンバーバッファーに格納されている配列からデータをプルします。レンダリングにバッファーオブジェクトを使用する場合、配列はバッファーオブジェクトのコンテンツからプルされます。

頂点データの出所は、バッファオブジェクトを使用したレンダリングとそれらを使用しないレンダリングの唯一の違いです。したがって、錐台カリングはありません。シーングラフ管理はありません。何もない。頂点データが保存される場所です。


1
少しはっきりさせて、VBOを使用して行う実際の最適化は、CPUとGPUの間のバスに関連していることを述べます。このバス速度がごくわずかである場合、VBOを使用することと、フロートのCPU側の配列を使用することの間に実質的に違いはありません。
notlesh

1
また、ドライバーは、CPUメモリーを含め、必要な場所にバッファーオブジェクトを自由に格納できることにも注意してください。
Maximus Minimus

それとは別に、VBO / VAOを構築し、その上でdrawarraysを呼び出すだけの方が、すべての頂点/面に対して固定パイプライン関数をループする必要があるよりも(非常に)簡単です。これは、「その頂点、その頂点などを取り、そこに素敵な幸せの小さな三角形を作って、次は...」ではなく、グラフィックカードに「この三角形のボックスをそのシェーダーに通す」と伝えるようなものです。ああ、ちょっと待って、今はVBOよりもシェーダーに取り組んでいます。
Exilyth、2011年

2

OpenGL配列バッファー(= VBOと呼ばれるもの)は1つの目的を果たします。ジオメトリデータをクライアントメモリではなくGPUメモリ内に保持することで、フレームごとに再送信する必要がなくなります。

そのように単純です:-)

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