Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3208 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Vertex Buffer Object en OpenGL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Vertex Buffer Object en OpenGL

n°1306580
befalimper​tinent
Posté le 15-02-2006 à 17:42:25  profilanswer
 

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 ...?

mood
Publicité
Posté le 15-02-2006 à 17:42:25  profilanswer
 

n°1306653
bjone
Insert booze to continue
Posté le 15-02-2006 à 19:47:17  profilanswer
 

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.

n°1312294
befalimper​tinent
Posté le 23-02-2006 à 14:50:36  profilanswer
 

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?

n°1312432
retrox
Posté le 23-02-2006 à 16:40:51  profilanswer
 

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).

n°1312475
bjone
Insert booze to continue
Posté le 23-02-2006 à 17:13:51  profilanswer
 

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).


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Vertex Buffer Object en OpenGL

 

Sujets relatifs
Opengl - Light &Normales+ [edit] probleme de mathOpengl - Tjs avoir une scene AA
[C++] OpenGL : Normales dans un GL_TRIANGLE_STRIP[C] Connaitre la taille d'un buffer
Visual Basic et openGL , ca s'aime ???[DirectX] D3DXLoadMeshFromX et vertex buffers
[ASP.NET, VB] Taille mémoire maximum d'un object ?Opengl - glitches
(delphi) implementer un fond avec opengl en utilisant glfw[OpenGL] Creer un menu
Plus de sujets relatifs à : Vertex Buffer Object en OpenGL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR