La réponse la plus correcte est, cela dépend de la façon dont vous le programmez, mais c'est une bonne chose à craindre. Alors que les GPU sont devenus incroyablement rapides, la bande passante vers et depuis la RAM du GPU ne l'est pas, et sera votre goulot d'étranglement le plus frustrant.
Ses données sont-elles envoyées à la mémoire du GPU une seule fois et restent-elles là pour toujours?
Esperons que oui. Pour la vitesse de rendu, vous voulez que autant de données soient stockées sur le GPU que possible, au lieu de les renvoyer à chaque image. Les VBO servent exactement ce but. Il existe à la fois des VBO statiques et dynamiques, les premiers étant les meilleurs pour les modèles statiques, et les seconds étant les meilleurs pour les modèles dont les sommets changeront chaque image (par exemple, un système de particules). Même en ce qui concerne les VBO dynamiques, cependant, vous ne voulez pas renvoyer tous les sommets à chaque image; juste ceux qui changent.
Dans le cas de votre bâtiment, les données de sommet resteraient là, et la seule chose qui changerait serait vos matrices (modèle / monde, projection et vue).
Dans le cas d'un système de particules, j'ai créé un VBO dynamique suffisamment grand pour stocker le nombre maximal de particules qui existera jamais pour ce système. Chaque image que j'envoie les données pour les particules émises cette image, avec quelques uniformes, et c'est tout. Lorsque je dessine, je peux spécifier un point de début et de fin dans ce VBO, donc je n'ai pas à supprimer les données de particules. Je peux juste dire de ne pas les dessiner.
Lorsque le modèle est réellement rendu à chaque image, les processeurs GPU doivent-ils récupérer ses données à chaque fois dans la mémoire GPU? Ce que je veux dire, c'est que si j'avais 2 modèles rendus plusieurs fois chacun, cela aurait-il de l'importance si je rendais d'abord le premier plusieurs fois puis le second plusieurs fois ou si je rendais le premier une seule fois, le second une seule fois et continué à l'entrelacer comme ça?
Le fait d'envoyer plusieurs appels de tirage au lieu d'un seul est une limite beaucoup plus grande. Découvrez le rendu instancié; cela pourrait vous aider beaucoup et rendre la réponse à cette question inutile. J'ai eu quelques problèmes de pilote avec lesquels je n'ai pas encore résolu, mais si vous pouvez le faire fonctionner, le problème est résolu.
De toute évidence, les cartes graphiques ont une mémoire RAM limitée - quand elles ne peuvent pas contenir toutes les données de modèle nécessaires pour le rendu d'une image, je suppose qu'elle continue de les récupérer (une partie) de la RAM du processeur à chaque image, est-ce correct?
Vous ne voulez pas manquer de RAM GPU. Si vous le faites, changez les choses pour que vous ne le fassiez pas. Dans le scénario très hypothétique que vous épuisez, cela va probablement se bloquer d'une manière ou d'une autre, mais je ne l'ai jamais vu arriver, donc honnêtement, je ne sais pas.
J'ai oublié de faire une distinction: il y a l'envoi des données au GPU et il y a la définition / liaison des tampons comme courant. Ce dernier provoque-t-il un flux de données?
Pas de flux de données significatif, non. Il y a un certain coût, mais c'est vrai pour chaque ligne de code que vous écrivez. Découvrir combien cela vous coûte est, encore une fois, à quoi sert le profilage.
création de tampon avec initialisation
La réponse de Raxvan semble bonne, mais elle n'est pas tout à fait exacte. Dans OpenGL, la création du tampon ne réserve aucun espace. Si vous souhaitez réserver de l'espace sans transmettre de données, vous pouvez appeler glBufferData et simplement passer null. (Voir la section des notes ici .)
mise à jour des données du tampon
Je suppose que vous voulez dire glBufferData, ou d'autres fonctions comme ça, non? C'est là que se produit le véritable transfert de données. (Sauf si vous passez nul, comme je viens de le dire dans le dernier paragraphe.)
lier le tampon comme actif (est-ce juste un moyen de dire à l'API que je veux que ce tampon soit rendu lors du prochain appel de dessin et qu'il ne fasse rien par lui-même?)
Oui, mais cela peut faire un peu plus que cela. Par exemple, si vous liez un VAO (objet tableau de vertex), puis liez un VBO, ce VBO devient lié au VAO. Plus tard, si vous liez à nouveau ce VAO et appelez glDrawArrays, il saura quel VBO dessiner.
Notez que bien que de nombreux didacticiels vous permettront de créer un VAO pour chaque VBO, on m'a dit que ce n'était pas leur utilisation prévue. Soi-disant, vous devez créer un VAO et l'utiliser avec chaque VBO qui a les mêmes attributs. Je n'ai pas encore essayé cela, donc je ne peux pas dire avec certitude si c'est mieux ou pire.
Appel d'appel API
Ce qui se passe ici est assez simple (de notre point de vue). Supposons que vous liez un VAO, puis appelez glDrawArrays. Vous spécifiez un point de départ et un nombre, et il exécute votre vertex shader pour chaque sommet de cette plage, qui à son tour transmet ses sorties sur la ligne. Cependant, ce processus est un autre essai en soi.