61

私は初心者向けの 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。誰かが状況に光を当てることができますか?

4

2 に答える 2

47

への呼び出しは、必要なときにいつでもglBindBuffer使用するように OpenGL に指示します。vertexBufferObjectGL_ARRAY_BUFFER

glEnableVertexAttribArrayOpenGL で頂点属性配列を使用することを意味します。この呼び出しがないと、指定したデータは無視されます。

glVertexAttribPointer、あなたが言ったように、OpenGLはそのデータがどのような形式になるかを本質的に知らないため、提供された配列データをどうするかをOpenGLに伝えます。

glDrawArrays上記のすべてのデータを使用して点を描画します。

OpenGL は大きなステート マシンであることを思い出してください。OpenGL 関数へのほとんどの呼び出しは、直接アクセスできないグローバル状態を変更します。glDisableVertexAttribArrayコードがand で終わるのはそのためglBindBuffer(..., 0)です。使用が終わったら、そのグローバルな状態を元に戻す必要があります。

于 2013-09-30T19:33:24.227 に答える
5

DrawArrays は からデータを取得しARRAY_BUFFERます。

glVertexAttribPointerデータは、頂点の定義を示す設定に従って「マッピング」されます。

あなたの例では、位置に1つの頂点属性(glEnableVertexAttribArray)が0あります(通常、16個の頂点属性、それぞれ4つのフロートを持つことができます)。次に、位置 0 から始まるバッファーから 3 つの GL_FLOATS を読み取ることによって、各属性が取得されることを伝えます。

于 2013-09-30T19:30:59.787 に答える