ターゲットをバッファオブジェクトにバインドしません。ターゲットは、(バッファオブジェクトなどの)ものをバインドできるOpenGLコンテキスト内の場所です。したがって、バッファオブジェクトをターゲットにバインドしますが、その逆ではありません。
バッファオブジェクト(VBOのようなものはありません。単にバッファオブジェクトがあります)は、OpenGLドライバが所有するフォーマットされていない線形のメモリ配列です。GL_ARRAY_BUFFER
バッファを関数の1つにバインドして呼び出すことにより、頂点配列データのソースとして使用できますgl*Pointer
。これらの関数は、現在にバインドされているバッファでのみGL_ARRAY_BUFFER
機能します。GL_ELEMENT_ARRAY_BUFFER
それらを関数の1つにバインドして呼び出すことにより、インデックスデータのソースとして使用できますglDrawElements
。
バッファオブジェクトの内容(、、、など)を変更するために使用される関数はglBufferData
すべてglMapBuffer
、glBufferSubData
操作の対象となるターゲットを具体的に取得します。そのため、現在バインドglBufferData(GL_ARRAY_BUFFER, ...)
されているバッファも同様GL_ARRAY_BUFFER
です。
したがって、バッファオブジェクトに影響を与える関数には、コンテンツを変更する関数と、操作でそれらを使用する関数の2種類があります。後者はソースに固有です。glVertexAttribPointer
常に現在バインドされているバッファを使用しGL_ARRAY_BUFFER
ます。別のターゲットを使用させることはできません。同様に、glReadPixels
常ににバインドされたバッファを使用しGL_PIXEL_PACK_BUFFER
ます。などなど。関数がバッファオブジェクトを処理するが、ターゲットをパラメータとして受け取らない場合、そのドキュメントには、バッファを検索するターゲットが記載されています。
注:頂点配列はちょっと奇妙です。頂点属性とバッファオブジェクトの間の関連付けは、を呼び出すことによって行われglVertexAttribPointer
ます。この関数は、現在GL_ARRAY_BUFFERにバインドされているバッファーオブジェクトを使用して、その属性に適切なデータを設定します。「現在バインドされている」とは、この関数が呼び出されたときにバインドされていることを意味します。したがって、この関数を呼び出した直後にを呼び出すことができ、レンダリングに行ったときに何が起こるかについては何もglBindBuffer(GL_ARRAY_BUFFER, 0)
変わりません。うまくレンダリングされます。
このようにして、属性ごとに異なるバッファオブジェクトを使用できます。glVertexAttribPointer
情報は、その特定の属性の別の呼び出しで変更するまで保持されます。