まず第一に、すべての OpenGL 状態と同様に、 で設定された状態は、glVertexAttribPointer
誰かがglVertexAttribPointer
(同じ属性インデックスに対して) 再度呼び出すまで変更されません。ただし、ここで重要なことは、 で変更された内部状態は、glVertexAttribPointer
レンダリングに使用されるバッファー オフセットを格納するだけでなく、呼び出し時に VBO バウンドにオフセットされるということglDraw...
です。また、呼び出し時にバインドされた実際のバッファ オブジェクトも格納しますglVertexAttribPointer
。
はい、頂点データを別の VBO から取得したい場合はいつでも、この VBO をバインドし、glVertexAttribPointer
この VBO がバインドされている間に適切な呼び出しを行う必要があります。あなたの場合、これは面倒に思えるかもしれませんが、これは実際には良いことです。この方法では、何かをレンダリングするときに現在バインドされているバッファについて心配する必要はありませんが、glVertexAttribPointer
. さらに重要なことは、レンダリングの前に別の VBO をバインドすることです。これにより、1 回のレンダリング呼び出しで異なる VBO から異なる頂点属性を取得できます (他にどのように行うでしょうか?)。
編集:ただし、頂点配列オブジェクトを使用して、頂点データの設定プロセスを容易にすることができます。それらは、一連の配列からのレンダリングに必要なすべての状態をカプセル化します (したがって、 によって変更されたすべてのものglVertexAttribPointer
、gl(En/Dis)ableVertexAttribArray
および にバインドされたバッファーGL_ELEMENT_ARRAY_BUFFER
ですが、前述のように、 にバインドされたバッファーではありませんGL_ARRAY_BUFFER
)。もちろん、呼び出す前にバッファを適切にバインドする必要がありますglVertexAttribPointer
。しかし、VAO を使用すると、セットアップ ルーチンでこのコードが必要になるだけで、レンダリングに必要なのは を呼び出すことだけglBindVertexArray
です。特定の ES デバイスがそれらをサポートしているかどうかはわかりませんが。