gKit2 light
|
le tuto précédent a montré comment manipuler un shader openGL pour dessiner un Mesh, ce tuto explique rapidement comment créer et configurer le vertex buffer et le vertex array qui permettent de dessiner directement un Mesh avec openGL.
que font Mesh et draw(mesh, program) pour afficher un objet ? comme expliqué dans le tuto précédent, les attributs de sommets doivent se trouver dans la memoire de la carte graphique pour que les vertex shader s'exécutent correctement.
la mémoire de la carte graphique est séparée de la mémoire de l'application : il n'est pas possible de faire un malloc
ou un new
directment, mais openGL propose des buffers comme mécanisme d'allocation de mémoire.
il faut d'abord créer un identifiant de buffer, cf glGenBuffers(), et le sélectionner pour le manipuler, cf glBindBuffer() :
pour donner la taille du buffer, et son contenu, cf glBufferData() :
le dernier parametre, GL_STATIC_DRAW, indique que le contenu du buffer ne sera pas modifie.
dernière étape, décrire le format des sommets du Mesh avec un vertex array object : même démarche, il faut créer un identifiant, cf glGenVertexArrays(), le sélectionner, cf glBindVertexArray(), et le configurer, cf glVertexAttribPointer() :
voila, les coordonnées des sommets du Mesh sont transférées dans un buffer, l'attribut est configuré dans un vertex array object, il suffira de le selectionner avant le glDraw() pour dessiner l'objet :
dernier detail, il ne faut pas oublier de conserver le nombre de sommets, et il n'est plus nécessaire de conserver l'objet Mesh !
cf configurer un format de sommet, vertex array object pour les détails supplémentaires, utiliser plusieurs buffers, plusieurs attributs, etc.
tuto9_buffers.cpp donne un exemple complet et stocke toutes les informations dans une structure Buffers :
les différentes variantes de glDraw() sont expliquées dans glDraw( ) et la famille.
on peut aussi ecrire une fonction utilitaire plus proche de l'utilisation de malloc
pour creer un buffer, mais ce n'est pas necessairement plus lisible que glBufferData...