Qu'est-ce que le "mode immédiat" ? Donnez un exemple de code s'il vous plaît.
Quand dois-je utiliser le mode immédiat au lieu du mode retenu ? Quels sont les avantages et les inconvénients de l'utilisation de chaque méthode ?
Qu'est-ce que le "mode immédiat" ? Donnez un exemple de code s'il vous plaît.
Quand dois-je utiliser le mode immédiat au lieu du mode retenu ? Quels sont les avantages et les inconvénients de l'utilisation de chaque méthode ?
Un exemple de "mode immédiat" est l'utilisation de glBegin
et glEnd
avec glVertex
entre eux. Un autre exemple de "mode immédiat" consiste à utiliser glDrawArrays
avec un tableau de sommets du client (c.-à-d. pas un objet tampon de vertex).
En général, vous ne voudrez jamais utiliser le mode immédiat (sauf peut-être pour votre premier programme "hello world") car il s'agit d'une fonctionnalité dépréciée qui n'offre pas des performances optimales.
La raison pour laquelle le mode immédiat n'est pas optimal est que la carte graphique est liée directement au flux de votre programme. Le pilote ne peut pas dire au GPU de commencer le rendu avant que glEnd
car il ne sait pas quand vous aurez fini de soumettre des données, et il doit également transférer ces données (ce qu'il peut faire). uniquement faire après glEnd
).
De même, avec un tableau de sommets du client, le pilote ne peut obtenir une copie de votre tableau qu'au moment où vous appelez la commande glDrawArrays
et il doit bloquer votre application pendant ce temps. La raison en est qu'autrement vous pourriez modifier (ou libérer) la mémoire du tableau avant que le pilote ne l'ait capturée. Il ne peut pas planifier cette opération plus tôt ou plus tard, car il sait seulement que les données sont valides à un moment précis.
En revanche, si vous utilisez par exemple un objet tampon de vertex, vous remplissez un tampon de données et le remettez à OpenGL. Votre processus ne possède plus ces données et ne peut donc plus les modifier. Le pilote peut compter sur ce fait et peut (même de manière spéculative) charger les données chaque fois que le bus est libre.
Tous vos appels ultérieurs à 'glDrawArrays' ou 'glDrawElements' iront dans une file d'attente et reviendront immédiatement (avant d'être réellement terminés !), de sorte que votre programme continue à soumettre des commandes pendant que le pilote les exécute une par une. Ils n'auront probablement pas non plus besoin d'attendre l'arrivée des données, car le pilote pourrait déjà le faire bien plus tôt.
Ainsi, le thread de rendu et le GPU fonctionnent de manière asynchrone, chaque composant est occupé à tout moment, ce qui permet d'obtenir de meilleures performances.
Le mode immédiat a l'avantage d'être très simple à utiliser, mais là encore, utiliser correctement OpenGL d'une manière non dépréciée n'est pas non plus très compliqué - cela ne demande que très peu de travail supplémentaire.
Voici le code typique de "Hello World" d'OpenGL en mode immédiat :
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);
glEnd();
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.