-
Remplacer les glBegin
Hello
Dans mon mini moteur 3d, j'utilise parfois des glBegin mais j'ai vu qu'ils allaient disparaître dans Opengl 3. Donc comment m'en débarrasser ?
Par exemple dans mon moteur 3d, j'utilise des glBegin(GL_QUADS) pour afficher des boutons, fenêtres, champs texte, etc de ma GUI.
J'ai pensé à 2 solutions mais je ne sais pas la quel est la meilleure :
:fleche: Utiliser un vertex buffer pour chaque bouton, fenêtre, etc. : simple à mettre en oeuvre mais peut-être pas très performant ?!
:fleche: Utiliser un std::vector de coordonnées pour tous les composants de ma GUI. Mais dans ce cas je vois 2 problèmes (enfin il me semble) :
- Si le std::vector devient trop petit niveau mémoire, il va devoir faire une ré-allocation mémoire et une copie du vector dans le nouvel emplacement mémoire et ce peut-être à chaque frame...bref ça ne risque pas d'être trop lent ?!
- Si ma mémoire est bonne, on ne peut utiliser qu'une texture par vertex buffer et moi j'ai une texture pour chaque composant de la GUI !
Merci d'avance...
-
Pour moi la solution "logique" serait de mettre un VBO par entité graphique, donc ta solution n°1. Je ne pense pas que ça puisse entrainer de perte de performance, au contraire les VBO sont sensés être bien plus performants que les glBegin/End.
-
salut,
les vertex buffers ne sont pas limités à une seule texture et ils sont plus performants que les glBegin/glEnd
quand au std::vector, tu peux lui donner une taille avec "reserve"
lorsque tu charges un objet (ou une gui) tu sais d'avance combien de vertex tu devras charger, donc pas de réallocation dynamique si ton "moteur" est bien pensé
-
Merci pour vos réponses, je vais utiliser un vertex buffer object pour chaque composants de ma GUI, je pense que c'est nettement plus simple.
Par contre j'ai une petite question à propos des modes des VBO. Si j'ai bien compris :
- STREAM_DRAW : a chaque frame on envois les informations à la carte graphique.
- STATIC_DRAW : on envois les informations qu'une seule fois à la carte graphique et les informations restent dans la mémoire de la carte graphique.
1) Si j'utilise du STREAM_DRAW et que je n'appel pas la fonction suivante à chaque frame, est ce que ça devrait bugger ? Parce chez moi ça ne semble pas bugger :
glBufferData(GL_ARRAY_BUFFER, size, vertexArray, GL_STREAM_DRAW);
Doit-je en conclure que même en STREAM_DRAW, les informations son gardé dans la mémoire de la carte graphique ?
2) Si les données de mon vertexArray ne change que 2/3 fois à la minute en moyenne, quel mode doit-je utiliser ?
Merci...