- Combien de vbos dois-je utiliser ?
Le moins possible. Le changement de VBO a un coût faible, mais mesurable. En général, vous essaierez de regrouper les données similaires dans des VBO. Par exemple, dans un jeu FPS, tous les types de déchets qui traînent dans la rue, les petits accessoires, etc., seront généralement situés dans le même VBO ou dans un petit nombre de VBO.
Il s'agit également de la taille des lots de dessins. glDraw…
qui rendent moins d'une centaine de primitives sont sous-optimaux (cela a toujours été le cas, même il y a 15 ans). Il est donc préférable d'utiliser au moins 100 primitives dans la mesure du possible. Mais si un seul maillage n'a que, disons, 20 triangles (accessoires à faible polycomptage pour l'instanciation ou autre), chacun dans son propre VBO, vous ne pouvez plus faire de lots plus importants.
glGenBuffers glBindBuffer glBufferData
MISE À JOUR Vous pouvez passer un pointeur nul à la fonction data
de glBufferData pour initialiser l'objet tampon sans définir les données.
- Comment mettre à jour les données vbos si la taille des données n'est pas fixe ?
Créez des VBO avec une granularité plus grossière que la taille de vos données. Votre système d'exploitation le fait de toute façon pour vos données côté hôte, c'est ce qu'on appelle la pagination. De plus, si vous voulez utiliser glMapBuffer Le fait que l'objet tampon soit un multiple de la taille de la page de l'hôte est très agréable pour l'ensemble du système.
La taille habituelle d'une page sur les systèmes actuels est de 4 Ko. C'est donc la granularité de la taille de l'OBV que je choisirais. UPDATE : Vous pouvez demander à votre système d'exploitation quelle taille de page il utilise. Cela dépend du système d'exploitation, je poserais une autre question à ce sujet.
Mettre à jour les données à l'aide de glBufferSubData ou les mapper avec glMapBuffer modifier dans la mémoire mappée côté hôte, puis glUnmapBuffer.
Si les données dépassent l'objet tampon, créez-en un nouveau, plus grand, et copiez-le avec glCopyBufferSubData. Voir le dernier paragraphe.
- Comment dois-je rendre les vbos ?
glBindBuffer glDraw
- Comment dois-je traiter les données dans vbos que je ne veux plus rendre ?
Si les données ne consomment qu'une partie de l'espace de stockage virtuel, qu'elles le partagent avec d'autres données et que vous ne manquez pas de mémoire, alors, eh bien, n'y accédez pas. L'idéal est de conserver un index permettant de savoir quelle partie de l'OBV est disponible pour quel type de tâche. Cela ressemble beaucoup à la gestion de la mémoire, en particulier à un système connu sous le nom de piles d'objets (obstacks).
Toutefois, il peut s'avérer utile de compacter un objet tampon existant. Pour ce faire, vous devez créer un nouvel objet tampon, le lier en tant que cible d'écriture, l'ancien objet tampon étant sélectionné en tant que cible de lecture. Utilisez ensuite glCopyBufferSubData pour copier le contenu dans un nouvel objet tampon plus compact. Bien sûr, vous devrez alors mettre à jour toutes les références au nom de l'objet tampon (=OpenGL ID) et aux décalages.
Pour cette raison, il est logique d'écrire une couche d'abstraction fine sur les objets tampons OpenGL qui garde la trace des données typées réelles dans les blobs sans structure que sont les objets tampons OpenGL.