Quand utiliser un tableau de sommets et quand utiliser un VBO?

14

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?

nkint
la source
3
Pour toute autre personne qui arrive ici, consultez la réponse la plus votée ici .... stackoverflow.com/questions/430555/…
afuzzyllama

Réponses:

14

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

ChrisE
la source
2
Dans ce PerformanceTuning.pdf, il est dit que les VBO "peuvent nuire aux performances dans des cas non optimaux" ... mais il n'élabore pas. Une idée de ce que sont ces cas? J'ai un cas où j'ai besoin de mettre à jour la géométrie à chaque image, donc je me demande si un tableau de sommets serait meilleur ou pire qu'un VBO dans ce cas. THX.
sidewinderguy
1
lire opengl.org/sdk/docs/man/xhtml/glDrawElements.xml et opengl.org/wiki/GlDrawElements - Vertex Arrays AREN'T obsolète ni supprimé, ils sont toujours pris en charge à partir d'OpenGL 4.x; clarifiez les faits, mec, parce que ce que vous diffusez n'est que de la désinformation
1
@vaxquis Les tableaux de vertex côté client sont déconseillés. Les tableaux de sommets côté serveur ne le sont pas. Les VAO sont une chose différente et sont destinés à sauver l'État. Il n'y avait rien de mal dans le message, mais il pourrait être plus précis s'il indiquait le côté client. Mais je suppose que c'était implicite.
concept3d
1
"Les tableaux de sommets côté client sont obsolètes. Les tableaux de sommets côté serveur ne le sont pas." "Vertex Arrays Ceux-ci sont disponibles dans OpenGL avant 3.0, obsolètes dans 3.0 et passés en 3.1+." "vous pouvez préspécifier des tableaux séparés de sommets (...) et les utiliser pour construire une séquence de primitives avec un seul appel à glDrawElements. Core dans la version 4.4" - Je vois une contradiction dans ces déclarations.
2
De plus, avant de dire quelque chose «est obsolète», précisez la source de cette déclaration, de préférence dans un document officiel. Pointant de StackExchange vers StackOverflow comme preuve n'est PAS la façon dont la science fonctionne, et défendre avec "je suppose que c'était implicite" n'est pas un argument. Personne n'a posé de questions sur les baies client / serveur, la question portait sur les vertex array au sens large, par rapport au VBO. Btw, je n'ai rien dit sur VAO, d'où vient cette idée?
11

(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+ glBufferDatapour 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'à effectuer glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)le rendu.

Ingénieur
la source
+1 VAO est un nom terrible et déroutant, et il me rappelle toujours ce qu'est devenu un désordre openGL.
concept3d
1
Je me souviens également d'avoir participé à une discussion sur cette question (la majeure partie a été supprimée). Encore une fois, le problème vient de l'horrible terminologie d'OpenGL. J'ai également modifié la réponse de Chris pour être plus précis.
concept3d