|
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 mémoire 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 directement, 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 paramètre, GL_STATIC_DRAW, indique que le contenu du buffer ne sera pas modifié plus tard.
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 sélectionner avant le glDraw() pour dessiner l'objet :
dernier détail, 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 demander à Mesh de créer et d'initialiser les buffers, avec Mesh::create_buffers( ) :
on peut aussi préciser quels attributs doivent être initialisés en plus de position. par exemple pour créer un vertex buffer ne contenant que les positions et les normales des sommets :
les attributs standards sont USE_POSITION, USE_NORMAL, USE_TEXCOORD, USE_COLOR, et USE_MATERIAL_INDEX. cf première application avec des shaders pour les détails et comment les utiliser dans un shader.