私は初心者向けのOpenGLチュートリアルに従っていますが、このコードスニペットについて少し混乱しています。
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); //Bind GL_ARRAY_BUFFER to our handle
glEnableVertexAttribArray(0); //?
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //Information about the array, 3 points for each vertex, using the float type, don't normalize, no stepping, and an offset of 0. I don't know what the first parameter does however, and how does this function know which array to deal with (does it always assume we're talking about GL_ARRAY_BUFFER?
glDrawArrays(GL_POINTS, 0, 1); //Draw the vertices, once again how does this know which vertices to draw? (Does it always use the ones in GL_ARRAY_BUFFER)
glDisableVertexAttribArray(0); //?
glBindBuffer(GL_ARRAY_BUFFER, 0); //Unbind
glDrawArrays
がどの頂点を描くべきか、そしてglEnableVertexAttribArray
で何をすべきかをどのように知っているのかわかりません。誰かが状況に光を当てることができますか?
glBindBuffer
への呼び出しは、_GL_ARRAY_BUFFER
_が必要なときにvertexBufferObject
を使用するようにOpenGLに指示します。
glEnableVertexAttribArray
は、OpenGLで頂点属性配列を使用することを意味します。この呼び出しがないと、指定したデータは無視されます。
glVertexAttribPointer
は、あなたが言ったように、OpenGLが提供された配列データをどう処理するかを指示します。OpenGLはそのデータがどの形式になるかを本質的に知らないからです。
glDrawArrays
は、上記のすべてのデータを使用してポイントを描画します。
OpenGLは大きなステートマシンであることを忘れないでください。 OpenGL関数のほとんどの呼び出しは、直接アクセスできないグローバル状態を変更します。そのため、コードがglDisableVertexAttribArray
とglBindBuffer(..., 0)
で終了します。使用が終了したら、そのグローバル状態を元に戻す必要があります。
DrawArraysはARRAY_BUFFER
からデータを取得します。
データは、glVertexAttribPointer
の設定に従って「マッピング」され、頂点の定義が何であるかがわかります。
この例では、0
の位置に1つの頂点属性(glEnableVertexAttribArray)があります(通常、それぞれ4つの浮動小数点数の16の頂点属性を持つことができます)。次に、位置0から始まるバッファーから3 GL_FLOATSを読み取ることにより、各属性が取得されることを伝えます。
ここに素晴らしいチュートリアル: http://www.arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.html