私はこれらの2つ、それらの使用方法とそれらの関係を理解しようとしています。単純な地形とテクスチャキューブを作成するとします。両方のオブジェクトに三角形の頂点の配列があり、立方体にテクスチャのデータを含む配列があります。私の質問は次のとおりですVAOとVBOを使用してこれら2つを作成およびレンダリングする方法は?
チュートリアルや本はたくさんありますが、これらの概念をどのように理解して使用する必要があるかについては、まだよくわかりません。
頂点配列オブジェクト(VAO)は、概念的には薄い状態のラッパーにすぎません。
頂点バッファオブジェクト(VBO)は実際のデータを格納します。
これについての別の考え方は、VAOは1つ以上のVBOに格納されたデータを記述するというものです。
VBO(および一般的なバッファオブジェクト)は、サーバー(GPU)メモリに格納されたデータの非構造化配列と考えてください。必要に応じて、頂点データを複数の配列にレイアウトしたり、それらを単一の配列にパックしたりできます。どちらの場合でも、バッファーオブジェクトは、データを格納する場所に集約されます。
頂点配列オブジェクトは、描画コマンドに必要なVBOメモリへの実際のpointersを追跡します。
ただし、Cなどの言語で知っているように、ポインタよりも少し洗練されています。頂点ポインターは、指定されたときにバインドされたバッファーオブジェクト、そのアドレス空間へのオフセット、頂点属性間のストライド、および基になるデータを解釈する方法(egを追跡するかどうかを追跡します整数値を保持するか、浮動小数点に変換するには[0.0、1.0]データ型の範囲に正規化する)。
たとえば、整数データは通常、浮動小数点に変換されますが、これは頂点ポインターを指定するために使用するコマンドです( glVertexAttribPointer (...)
vs. glVertexAttribIPointer (...)
)この動作を決定します。
頂点配列オブジェクトは、現在_GL_ELEMENT_ARRAY_BUFFER
_にバインドされているバッファーオブジェクトも追跡します。
_GL_ELEMENT_ARRAY_BUFFER
_は、コマンド: glDrawElements (...)
からインデックスのリストを取得します(ゼロ以外のバインディングを想定)およびはありませんglElementArrayPointer (...)
コマンド。 glDrawElements (...)
ポインタと描画コマンドを1つの操作に結合し、アクティブな頂点配列オブジェクトに格納されているバインディングを使用してこれを実現します。
これで、オブジェクトが頂点データを共有しない限り、通常、それぞれに固有のVBOのセットが必要になります。
必要に応じて、ソフトウェア全体で単一のVAOを使用できます。または、バインドされたVAOを変更すると、さまざまなオブジェクトの描画に必要な状態セットのほぼ全体が変更されるという事実を利用できます。
したがって、地形と立方体の描画は、バインドされたVAOを変更するのと同じくらい簡単です。それぞれに異なるテクスチャを適用する必要がある場合は、それ以上のことを行う必要がありますが、VAOはすべての頂点データ関連のセットアップを処理します。
あなたの質問はここでは簡単には答えられませんが、チュートリアルでは答えられます。あなたはおそらくこれら2つのWebサイトをすでに知っていますが、そうでない場合は、参照を残します。
今あなたの質問を解明しようとしています、頂点配列オブジェクトは、描画呼び出しのためのAPIオーバーヘッドを減らすことを目的として設計されたOpenGLオブジェクトです。これは、頂点バッファーとそれに関連付けられた状態のコンテナーと考えることができます。おそらく古いディスプレイリストに似たもの。通常、VAOとVBOの間には1対1の関係があります。つまり、各VAOには一意のVBOが含まれています。しかし、これは厳密には必要ありません。同じVBOを参照する複数のVAOを持つことができます。
これをコードでモデル化する最も簡単な方法は、VAOクラス/タイプとそれにVBOをアタッチするメソッドを用意することだと思います。次に、VAOのインスタンスを各メッシュに割り当てます。メッシュは、独自のVBOタイプまたは共有されているVBOタイプへの参照を持つことができます。