J'essaie d'en savoir plus sur les tableaux de sommets et les objets tampons de sommets , mais je ne comprends pas les différences en termes de:
- cas d'utilisation (géométrie statique comme les terrains, géométrie qui change chaque image comme un système de particules, etc.)
- performance
- portabilité (ancienne carte graphique, consoles, appareils comme Android ou iPhone, etc.)
quelques clarifications?
Réponses:
Voici un article décent sur les VBO.
Performance
Voici un bon aperçu de la sémantique d'appel.
Voici un autre bon aperçu des problèmes de performances; nous y voyons que les VBO sont plus performants que les tableaux.
La raison pour laquelle nous préférons les VBO est que les données sont chargées sur la carte, et vous n'avez donc pas à les transférer à chaque image. Selon le type de VBO créé, vous pouvez donner au pilote graphique des indications sur l'utilisation (écriture-plusieurs, lecture-plusieurs vs écriture-plusieurs, jamais lu, etc.).
Usage
Les VBO sont vraiment bons pour la géométrie statique comme le terrain que vous ne vous attendez pas à changer, ou pour la géométrie instanciée.
Les tableaux de sommets sont bons pour les données qui changent fréquemment mais qui sont également lues par la machine hôte - donc, pour le rendu direct des données qui sont manipulées (les tampons de données du télémètre laser, par exemple, sont là où je les ai utilisés) fréquemment. Si vous parvenez à ne jamais lire les données sur le périphérique hôte (il suffit donc de les pousser sur la carte), les VBO en mode écriture seule sont une bonne option.
Portabilité
Tableaux Vertex côté client Celles-ci sont disponibles dans OpenGL avant 3.0, obsolètes dans 3.0 et disparues dans 3.1+. OpenGL ES les prend en charge (OpenGL ES 2 ne le fait pas).
VBO Ceux-ci sont disponibles après OpenGL 1.5. Ce sont le seul moyen de stocker des données de géométrie dans OpenGL ES 2 (et donc WebGL).
la source
(J'ajoute ceci ici en raison du fait que la réponse de ChrisE est très ambiguë, ce qui est malheureusement dû à l'ambiguïté de la question d'origine. Cependant, je vais supposer que la question du PO aurait dû être intitulée "quand utiliser les VAO et quand utiliser les VBO ".)
V ertex B uffer O bjects (qui ne sont vraiment pas différents des autres types de B uffer O bjects, par exemple U niform B uffer O bjects) fournir un moyen de données de sommet de l' ajout au matériel graphique.
V Ertex A rray O bjects sont utilisés en plus de VBO s afin d'améliorer les performances côté client (côté CPU), en réduisant le nombre d'appels nécessaires pour rebind tampons de sommets individuels et sommet de re-définir des attributs à chaque fois que vous voulez changer pour rendre d'une certaine manière. Au lieu de faire tout ce qui fonctionne à chaque image, vous le faites une fois (à l'initialisation), puis reliez simplement le VAO approprié pour chaque (ensemble de) appel (s) de dessin qui utilise les attributs de sommet associés.
Malgré cela, l'utilisation des VAO ne vous dégage pas de la responsabilité supplémentaire d'avoir à faire
glBindBuffer
+glBufferData
pour toutes les données qui changent chaque image, par exemple, les positions / rotations / matrices de transformation des entités de jeu. Ce n'est que lorsque vous disposez de données entièrement statiques que vous n'avez qu'à effectuerglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
le rendu.la source