この 2010 年の質問を見ると、最新の OpenGL の頂点バッファーに関して、ダイレクト ステート アクセスが利用できない場合はまだありますか? フレームバッファ、テクスチャなどで DSA を使用するようにグラフィックス ライブラリのほとんどを変更しましたが、頂点配列の状態を設定するために「バインド」する必要があります (配列のバインド、インデックス バッファのバインド、頂点バッファのバインド、配列のバインド解除など)。 )。
更新 1: BDL の回答から、パラメーターが何をするのか理解できませんでした。非常に単純な頂点バッファー (1 つの属性、位置) の単体テストでは、空白の画面が表示されます (頂点ストリームを記述する古い方法で問題なく動作しました)。単一の三角形を描画するだけで、インデックス バッファーは必要ありません。
これが私がやっていることです、コメントは私の理解です:
::glEnableVertexArrayAttrib(vao, // VAO name.
0); // Attribute index (layout in shader).
::glVertexArrayVertexBuffer(vao, // VAO name.
0, // Binding point.
vbo, // VBO name.
12, // Stride (bytes).
0); // Offset (bytes).
::glVertexArrayAttribFormat(vao, // VAO name.
0, // Attribute index (layout in shader).
3, // Component count (x,y,z).
GL_FLOAT, // Type.
GL_FALSE, // Normalised.
0); // Offset (bytes).
::glVertexArrayAttribBinding(vao, // VAO name.
0, // Attribute index (layout in shader).
0); // Binding point.
これで、バインディング ポイントについて「理解」したと思います。それらは、別の属性セットにすばやく簡単に交換できるように、割り当てることができる任意の番号です。したがって、この単純なテストには 0 を使用するだけで十分です。
glCreateBuffers を使用して vbo を作成し、glCreateVertexArrays を使用して vao を作成しています (以前のバインド可能なスタイルから変更されています)。デバッグ出力はなく (デバッグ コンテキストはオン)、すべての呼び出しは glGetError でチェックされ、エラーは報告されません。
更新 2: glVertexArrayVertexBuffer ストライドとオフセットの順序が間違っていました。それは今動作します。
更新 3: glVertexArrayVertexBuffer は、VBO 内の各属性に対して 1 回ではなく、1 回呼び出されます (位置、テクスチャなどをインターリーブしている場合)。