即時モードからVBOに切り替えるにはどうすればよいですか?


7

私はOpenGLを短期間使用していますが、VBOについて説明が必要です。私が理解しているように、VBOはVRAMに格納されたオブジェクトです。即時モードでは、テクスチャを適用するために、テクスチャをバインドし、頂点座標の前にテクスチャ座標を指定するだけですが、VBOではそのようには見えません。

質問1: VBOでテクスチャデータを指定できますか?データのどの部分ですか?

通常、2Dでゲームを作成するときは、すべてのオブジェクトを異なるクラスのインスタンスに格納し、描画ルーチンが起動したら、画面上にあるオブジェクトを描画します。3D環境では、画面上にオブジェクトを描画するだけでは少し難しくなりますが、いくつかの数学ではそれが可能であると確信しています。

質問2:どのオブジェクトをレンダリングする必要があるかがわかったら、それらの対応するオブジェクトに「適用」リクエストを送信し、それらを自分自身に適用させるのは許容できるほど速くなりますか?それとももっと良い方法がありますか?

質問3:完全に動的なマップがあり、オブジェクトがそれほど頻繁に変更されない場合、とのパフォーマンスの違いに関するガイドラインは GL_STATIC_DRAWありGL_DYNAMIC_DRAWますか?

最後の質問:頂点リストの使用を検討すべきですか?または、VBOはより良いオプションですか?


質問2のテーマについて...高レベルのレンダーオブジェクトにそれ自体を描画させることを具体的に意味しているのか、それとも低レベルのVBO機構について具体的に話しているのかはわかりません。しかし、前者の場合は、この質問を見たいと思うかもしれません。

glDrawElements各オブジェクトを呼び出しますか、それともすべてを三角形として保存し、1つだけにしますかglDrawElements?どちらの方法も実行可能ですか?
ultifinitus '19年

回答:


6

回答1:

もちろん可能ですが、テクスチャリング機能がなければ、頂点バッファーはほとんど役に立ちません。VBOは、シェーダーによって解釈される、指定した形式(位置チャネル、通常チャネル、texcoordチャネルなど)のバイナリデータのチャンクです。オブジェクトを描画するときは、GPUにデータのそのバッチをフェッチし、シェーダーで指定された操作(頂点変換、ライト計算、テクスチャフェッチなど)を適用するように指示しています。

たとえば、クワッドが格納されたVBOがあるとします。VBOは、4つの頂点の位置とテクスチャ座標情報を保存します。あとは、VBOをバインドし、IBOをバインドしてクワッドを構成する三角形を指定し、選択したテクスチャを使用して全体を描画するようにシェーダーに指示するだけです。VBOとIBOがアクティブになったので、シェーダーのテクスチャパラメーターを変更し、ドロー関数を再度呼び出して、クワッドを別のオブジェクトに再利用するだけです。

回答2:

回答1で指定されているように、VBOを作成してVRAMに保存した場合は、シェーダー変数を更新し、glDrawElements再度呼び出してオブジェクトを再描画するだけで済みます。

回答3:

まあ、それがGL_DYNAMIC_DRAWあなたが望むものであれば、あなたはマップ全体に適用することができます。これら2つのオプションの違いは、ドライバーがダイナミックバッファーをVRAMの最も高速な部分に格納することを選択することです。そのため、ジオメトリが繰り返し変更されないオブジェクトに使用すると、無駄になります。glBufferDataのOpenGLリファレンスは、バッファの最適な使用法についてのヒントを提供します。

最終的な答え:

glDrawArraysはVBOのプリミティブバージョンにすぎません。データはチャネルに分割されますが、呼び出しごとにGPUに再アップロードされます。最高のパフォーマンスが必要な場合は、VBOを使用してください。


1

r2d2rigoの答えには完全に満足していますが、VBOについて視覚化する方法を説明したいと思います:D

まず、VBOはVertex Buffer Objectを意味しますが、vextex座標のみを保持するという意味ではありません。

    A Vertex will have attributes such as coordinates,texture 
    coordinates,normals,color.The whole thing makes a well defined vertex. 

したがって、ここでは、「頂点属性全体を保存できる」などのVBOを理解する必要があります。基本的に、VBOは頂点情報のいずれかにバインドできる「バッファ」です。

回答1:はい(上記の説明を確認してください)

回答2:VBOは通常、通常の頂点リストより「高速」です。これは、フレームごとに頂点情報をプッシュする必要がないためです(データが静的な場合)。基盤となるアーキテクチャがユニファイドメモリアーキテクチャであっても、不必要なデータの「上書き」がないため、メリットがあります。

回答3:STATIC_DRAW / DYNAMIC_DRAWは、基になるGPUにバッファーを保持する場所を指示するためのフラグにすぎません。基になるGPUは、指定されたフラグに基づいてバッファーを保持する場所を決定します。したがって、スループットを向上させるためにこれを念頭に置く必要があります。ただし、Unifiedメモリアーキテクチャ(GPUがメインRAMを共有する場所)では、大きな違いはないと思います。

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