Vertex Buffer Object en OpenGL

Vertex Buffer Object en OpenGL - C++ - Programmation

Marsh Posté le 15-02-2006 à 17:42:25    

J'ai voulu utiliser dans mon application les vertex buffer object à la place des Display list pour gagner en performances.
Mais j'ai dû mal les utiliser car j'obtient des fps bien inférieurs à ma première version avec les display list (400 fps pour VBO vs 3000 pour DL).
Quelqu'un a t-il des infos à ce sujet?
J'ai pris exemple sur le tutorial de nehe en OpenGL. J'ai également vu ici et là l'utilisation des index buffer que je n'utilise pas. C'est peut être à cause de ça que je n'obtient pas de bonnes performances.
Si quelqu'un à d'autres tutoriaux à me passer, ou des programmes qui tournent bien ...?

Reply

Marsh Posté le 15-02-2006 à 17:42:25   

Reply

Marsh Posté le 15-02-2006 à 19:47:17    

oui. enfin je penses, je code pas en OpenGl, mais en DirectX...
 
quand tu utilises les Display List, le driver s'occupe de l'optimisation de la géométrie incluse, donc j'espère mais je suis pas sûr, qu'il génère de lui même des Vertex & Index buffer.
 
sinon OUI, si n'utilises pas d'IndexBuffer, et qu'il y a donc duplication des vertexs dans le Vertex Buffer, tu ne profites pas du cache Post-T&L.
 
donc sans le cache Post-T&L, pour un triangle indépendant, le gpu transformera 3 vertexs par primitive, alors qu'avec le cache Post-T&L tu auras une moyenne à la louche de 1~2 vertexs tranformés.

Reply

Marsh Posté le 23-02-2006 à 14:50:36    

Ok. J'ai utiliser un index buffer et j'ai pas mal augmenté mes fps à ce niveau.
Seulement il y a un autre point ou je dois perdre en performance : j'utilise 3 buffers  différents pour les coordonnées, la couleur et la normal d'un Vertex ( plus le buffer pour l'index).
Ainsi au niveau de la carte graphique, le GPU est obligé de "switcher" entre ces 3 buffers d'ou une perte de temps.
Dans ma derniere version je ne sauvegarde que les coordonnées (donc plus que deux buffers : le Vertex et l'Index) et la j'obtiens des performances corretes.
 
Mais je sais qu'il est possible de n'utiliser qu'un seul VB tout en sauvegardant coordonnées, couleur et normales ( une peu comme avec les interleaved array ). Seulement plusieurs problemes se pose alors :  
Est ce que cela fonctionne pareil que les interleaved Vertex c'est à dire en utilisant

Code :
  1. glInterleavedArrays(GL_C4F_N3F_V3F, sizeof(VERTEX), vertices);
  2. glDrawElements(GL_TRIANGLES, nb_faces*3, GL_UNSIGNED_INT, indices);


au moment de l'affichage
 
Faut t'il modifier les entiers dans le tableau indices pour prendre en compte le décalage du aux 4 float pour la couleur et aux 3 pour les normales dans le tableau vertices (ou le flag GL_C4F_N3F_V3F suffit) ?
Se sert-on dans ce cas de  
glColorPointer (4, GL_FLOAT, 0, 0);  et glNormalPointer (3, GL_FLOAT, 0, 0);
au moment de la création du VB?

Reply

Marsh Posté le 23-02-2006 à 16:40:51    

Non dans ce cas il te faut setter les pointers avec les bons offsets et le stride qui va bien.
 
Sinon pour les display lists, il s'agit d'un path séparé (ie il ne s'appuie pas sur l'api vertex buffer).

Reply

Marsh Posté le 23-02-2006 à 17:13:51    

befalimpertinent a écrit :

Ok. J'ai utiliser un index buffer et j'ai pas mal augmenté mes fps à ce niveau.
Seulement il y a un autre point ou je dois perdre en performance : j'utilise 3 buffers  différents pour les coordonnées, la couleur et la normal d'un Vertex ( plus le buffer pour l'index).
Ainsi au niveau de la carte graphique, le GPU est obligé de "switcher" entre ces 3 buffers d'ou une perte de temps.
Dans ma derniere version je ne sauvegarde que les coordonnées (donc plus que deux buffers : le Vertex et l'Index) et la j'obtiens des performances corretes.
 
Mais je sais qu'il est possible de n'utiliser qu'un seul VB tout en sauvegardant coordonnées, couleur et normales ( une peu comme avec les interleaved array ). Seulement plusieurs problemes se pose alors :  
Est ce que cela fonctionne pareil que les interleaved Vertex c'est à dire en utilisant

Code :
  1. glInterleavedArrays(GL_C4F_N3F_V3F, sizeof(VERTEX), vertices);
  2. glDrawElements(GL_TRIANGLES, nb_faces*3, GL_UNSIGNED_INT, indices);


au moment de l'affichage
 
Faut t'il modifier les entiers dans le tableau indices pour prendre en compte le décalage du aux 4 float pour la couleur et aux 3 pour les normales dans le tableau vertices (ou le flag GL_C4F_N3F_V3F suffit) ?
Se sert-on dans ce cas de  
glColorPointer (4, GL_FLOAT, 0, 0);  et glNormalPointer (3, GL_FLOAT, 0, 0);
au moment de la création du VB?


 
là je sais pas trop, en DirectX tu crées le buffer à la bonne taille, et tu déclares la topolgie des éléments. (offset et taille lot de vertex) a priori ça correspond à ce que dit retrox.
 
les buffers multiples c'est généralement déconseillé par Ati & nVidia, c'est obligatoire par exemple dans le cas du Geometry Instancing, où tu as un vb/ib de la géométrie qui repassera 'n' fois, et un vb des 'n' états d'instancing (matrices, vecteur lumière et autres grandeurs).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed