それはVAOの正しい使い方ですか?
いいえ1。
glVertexAttribPointer
GL_ARRAY_BUFFER
関数が呼び出された時点でバインドされていたバッファ オブジェクトを使用します。したがって、これを行うことはできません:
glVertexAttribPointer(...);
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glDrawArrays(...);
これは使用しませんbufferObject
。が最初に呼び出されたGL_ARRAY_BUFFER
ときにバインドされていたものを使用します。glVertexAttribPointer
VAO はこの状態をキャプチャします。そのため、VAO は、頂点属性ごとに、GL_ARRAY_BUFFER
呼び出されたときにバインドされたバッファー オブジェクトを格納します。これにより、次のようなことができます。
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, buffer1);
glVertexAttribPointer(0, ...);
glVertexAttribPointer(1, ...);
glBindBuffer(GL_ARRAY_BUFFER, buffer2);
glVertexAttribPointer(2, ...);
アトリビュート 0 と 1 は から取得されbuffer1
、アトリビュート 2 は から取得されbuffer2
ます。VAO は、その状態をすべてキャプチャするようになりました。レンダリングするには、次のようにします。
glBindVertexArray(VAO);
glDraw*();
つまり、属性のストレージが OpenGL でどこから来るかを変更したい場合は、そのformatも変更する必要があります。同じフォーマットであっても、再度呼び出す必要がありますglVertexAttribPointer
。
1 : この説明は、新しいARB_vertex_attrib_bindingを使用していないことを前提としています。または、別の方法で知られているように、「Direct3D が頂点属性バインディングを行う方法とまったく同じです。」 この拡張機能を提供する実装を使用している場合は、属性形式が関連付けられていないため、話していることを効果的に行うことができます。バッファ オブジェクトのストレージ。また、の拷問された論理はなくなりました。glVertexAttribPointer
一般に、OpenGL の世界でこれを解決する方法は、できるだけ多くのものを同じバッファー オブジェクトに入れることです。それができない場合は、オブジェクトごとに 1 つの VAO を使用してください。