Je suis quelques tutoriels OpenGL débutants, et je suis un peu confus à propos de cet extrait de code:
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
Je ne comprends pas comment glDrawArrays
sait quels sommets dessiner, et quelles sont toutes les choses à faire avec glEnableVertexAttribArray
. Quelqu'un pourrait-il faire la lumière sur la situation?
L'appel à glBindBuffer
indique à OpenGL d'utiliser vertexBufferObject
chaque fois qu'il a besoin du GL_ARRAY_BUFFER
.
glEnableVertexAttribArray
signifie que vous voulez qu'OpenGL utilise des tableaux d'attributs de vertex; sans cet appel, les données que vous avez fournies seront ignorées.
glVertexAttribPointer
, comme vous l'avez dit, indique à OpenGL ce qu'il faut faire des données de tableau fournies, car OpenGL ne sait pas par nature dans quel format ces données seront.
glDrawArrays
utilise toutes les données ci-dessus pour tracer des points.
N'oubliez pas qu'OpenGL est une grosse machine à états. La plupart des appels aux fonctions OpenGL modifient un état global auquel vous ne pouvez pas accéder directement. C'est pourquoi le code se termine par glDisableVertexAttribArray
et glBindBuffer(..., 0)
: vous devez remettre cet état global lorsque vous avez fini de l'utiliser.
DrawArrays prend les données de ARRAY_BUFFER
.
Les données sont "mappées" selon votre configuration dans glVertexAttribPointer
qui indique quelle est la définition de votre sommet.
Dans votre exemple, vous avez un attribut de sommet (glEnableVertexAttribArray) à la position 0
(vous pouvez normalement avoir 16 attributs de sommet, chacun 4 flottants). Ensuite, vous dites que chaque attrib sera obtenu en lisant 3 GL_FLOATS dans le tampon à partir de la position 0.
grand tutoriel ici: http://www.arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.html