8

コードのコア(赤い長方形を表示):

//bind program, set uniforms, bind vbo
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
//unbind vbo, unbind program

コンテキストをOpenGL3.xに切り替えると、このコードは機能しなくなります(背景の色しか表示されません)が、上記のコードと同じ方法でVAOを初期化してから、VAOをバインドしてglDrawArraysを呼び出すと、その後、それは動作します。

何が問題なのですか?VAOを使用せずにVBOを描画するにはどうすればよいですか?

(シェーダーは本当に単純ですが、複数の行列とpsのみが赤色を出力します)

4

1 に答える 1

8

OpenGL-3コア仕様を見てみましょう:

セクション2.10

第一段落:

GLの頂点ステージで使用されるバッファオブジェクトは、頂点配列オブジェクトを形成するために一緒に収集されます。頂点プロセッサによって使用されるデータの定義に関連するすべての状態は、頂点配列オブジェクトにカプセル化されます。

最後の段落:

頂点配列データの位置と編成を指定する*Pointerコマンドのいずれかが呼び出され、ゼロがARRAY BUFFERバッファーオブジェクトバインディングポイントにバインドされ、ポインター引数がNULL³でない場合、INVALIDOPERATIONエラーが生成されます。

そして、³脚注で:

このエラーにより、クライアント配列ポインタを含む頂点配列オブジェクトを作成できなくなりますが、バッファオブジェクトのバインドを解除することはできます。

言い換えれば、OpenGL-3-coreではVAOを使用する必要があります

于 2011-06-20T16:18:58.133 に答える