web-dev-qa-db-ja.com

glDrawArraysはどのように描画するのかをどのように知るのですか?

私は初心者向けの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で何をすべきかをどのように知っているのかわかりません。誰かが状況に光を当てることができますか?

47
w4etwetewtwet

glBindBufferへの呼び出しは、_GL_ARRAY_BUFFER_が必要なときにvertexBufferObjectを使用するようにOpenGLに指示します。

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

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

glDrawArraysは、上記のすべてのデータを使用してポイントを描画します。

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

38
Steve Howard

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

データは、glVertexAttribPointerの設定に従って「マッピング」され、頂点の定義が何であるかがわかります。

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

ここに素晴らしいチュートリアル: http://www.arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.html

3
fen