web-dev-qa-db-fra.com

Comment glDrawArrays sait-il quoi dessiner?

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?

47
w4etwetewtwet

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.

38
Steve Howard

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

3
fen