私は VAO に依存していると思われる問題に直面していますが、確信はありません。
VAOの正しい使い方はよく分かりませんが、GLの初期化中に私が行っていたのは単純な
glGenVertexArrays(1,&vao)
続いて
glBindVertexArray(vao)
そしてその後、描画パイプラインで、glBindBuffer()、glVertexAttribPointer()、glEnableVertexAttribArray()などなど...最初にバインドされたVAOを気にせずに
これは正しいやり方でしょうか?
ベストアンサー1
VAO は、バインド方法に関して VBO やテクスチャと同様に動作します。プログラム全体にわたって 1 つの VAO をバインドしても、VAO なしでレンダリングするのと同じなので、パフォーマンス上の利点はありません。実際、実装が描画時に頂点属性設定をインターセプトする方法によっては、速度が遅くなる可能性があります。
VAO のポイントは、初期化中にオブジェクトを描画するために必要なすべてのメソッドを 1 回実行し、メイン ループ中の余分なメソッド呼び出しのオーバーヘッドをすべて削減することです。ポイントは、複数の VAO を用意し、描画時にそれらを切り替えることです。
ベストプラクティスの観点から、コードを整理する方法は次のとおりです。
initialization:
for each batch
generate, store, and bind a VAO
bind all the buffers needed for a draw call
unbind the VAO
main loop/whenever you render:
for each batch
bind VAO
glDrawArrays(...); or glDrawElements(...); etc.
unbind VAO
これにより、バッファのバインド/アンバインドや各頂点属性のすべての設定の受け渡しの煩雑さが回避され、VAO をバインドする単一のメソッド呼び出しのみで置き換えられます。