La pile matricielle d'OpenGL vs la multiplication manuelle

8

Ce qui est plus efficace en utilisant la pile de transformation d'OpenGL ou en appliquant les transformations à la main.

J'ai souvent entendu dire que vous devriez minimiser le nombre de transitions d'état dans votre pipeline graphique. Pousser et faire éclater des matrices de traduction semble être un grand changement. Cependant, je me demande si la carte graphique pourrait plus que compenser le hoquet du pipeline en utilisant son matériel d'exécution parallèle pour multiplier en masse les sommets.

Mon cas spécifique. J'ai rendu la police sur une feuille de sprite. Les coordonnées de chaque caractère ou d'une chaîne sont calculées et ajoutées à un tampon de vertex. Maintenant, je dois déplacer cette chaîne. Serait-il préférable de parcourir le tampon de sommets et d'ajuster chacun des sommets à la main ou de pousser temporairement une nouvelle matrice de traduction?

deft_code
la source
Cela dépend de la version GL que vous ciblez. Ils sont obsolètes dans 3.x et les versions ultérieures.
The Communist Duck

Réponses:

7

Je crois comprendre que dans les versions les plus récentes de la spécification (3.3 et 4.x), les piles de matrices ont disparu et vous devez suivre vos matrices de transformation à la main. Je pense que cela pourrait également être vrai pour la spécification mobile (ES).

Si vous cherchez un moyen cohérent de gérer vos matrices à la main, vous pourriez être intéressé par GLM . C'est une bibliothèque mathématique assez soignée (qui inclut des transformations matricielles) modélisée d'après la spécification GLSL, vous n'avez donc qu'à garder un ensemble de routines mathématiques dans votre tête lorsque vous traitez avec du code OpenGL.

Bob Somers
la source
Quelqu'un peut-il confirmer cela? J'ai appris la programmation graphique avec OpenGL 1.5 et je pensais que j'étais avancé parce que j'expérimentais avec certaines des fonctionnalités 2.0. Vous pourriez dire que je suis un peu hors de la boucle. La suppression de la prise en charge des matrices de traduction semble être un énorme inconvénient.
deft_code
1
Juste revérifié. Oui, les piles de matrices sont déconseillées en 3.0 - 3.2 et supprimées en 3.3 et 4.x. L'idée est que puisque l'ensemble du pipeline est devenu programmable, vous passerez simplement votre matrice finale dans votre shader et partirez de là. Cependant, rien ne vous empêche de vous en tenir à OpenGL 2.0. Toutes les fonctionnalités de la pile matricielle auxquelles vous êtes habitué seront toujours là.
Bob Somers
Notez que cela ne signifie pas que "la prise en charge des matrices de traduction" a été supprimée, @deft_code. Une matrice de traduction n'est qu'un ensemble particulier de valeurs à virgule flottante après tout, vous pouvez en créer une vous-même. C'est plus dans le domaine de "l'algèbre linéaire" que de l'accès au pipeline graphique, vraiment - notez que D3D n'a pas de fonctions analogues non plus (ils sont dans une bibliothèque d'utilitaires séparée, D3DX).
1
Légère addition: GLES 1.x est l'analogue à fonctionnalité fixe d'OpenGL 1.5 (ish) et comprend la texture, la vue du modèle et les piles de projection. GLES 2.x est l'OpenGL intégré entièrement programmable et n'inclut pas du tout les opérations matricielles, ni aucun des autres éléments du pipeline de fonctionnalités fixes. Donc, dans GLSL, il n'y a pas non plus de gl_Vertex / Normal / Color / etc. La façon dont vous transmettez les informations à un programme de shaders dépend entièrement de vous.
Tommy
3

La pile est l'option la moins optimale ici - pas parce que la pousser et l'écraser était coûteuse, car elle ne devrait jamais induire un changement d'état complexe au niveau du pilote (la matrice ne devrait pas être envoyée à la carte jusqu'à ce qu'une commande de rendu soit émise , il s'agit donc généralement de manipulations côté processeur dans l'API).

Le problème avec la pile est qu'elle a une limite à quelle distance vous pouvez la pousser - c'est l'un des paramètres que vous pourriez obtenir via glGet * je pense. Il n'y a pas de gros avantage à utiliser la pile, sauf si vous n'avez pas ou êtes incapable / ne souhaitez pas écrire de mathématiques matricielles. Je recommanderais de le faire vous-même.

Je ne sais pas quel est l'état des fonctions de pile dans GL moderne. Je pense qu'ils ont également été dépréciés / supprimés, mais je n'ai pas eu besoin d'utiliser réellement GL depuis un certain temps, donc je ne me suis pas tenu à jour.


la source
3

Comme d'autres l'ont noté, la pile matricielle est en voie de disparition, ce qui est une bonne raison pour rechercher des alternatives.

Sur l'un de mes projets, j'ai utilisé les opérations matricielles d'OpenGL pour calculer mes matrices, mais j'ai finalement dû utiliser des fonctions glGet pour récupérer la matrice afin de pouvoir effectuer certaines opérations sur la matrice que les propres fonctions d'OpenGL ne prenaient pas en charge. La performance était épouvantable, et j'ai retracé la perte à la fonction glGet unique. Il est possible que les opérations matricielles soient en fait effectuées sur le GPU d'une manière ou d'une autre, et l'utilisation de glGet a provoqué un vidage du pipeline, ou quelque chose du genre.

Quelle que soit la raison, j'ai remplacé les opérations matricielles par CML , la bibliothèque mathématique configurable, et les performances se sont considérablement améliorées. Non seulement je n'étais plus lié aux mesures de performance des opérations de matrice OpenGL, CML comprenait également des tonnes d'opérations que OpenGL ne prend pas en charge.

Et l'implémentation d'une pile de matrices est assez facile en utilisant le vecteur STL ou quelques-uns.

Jari Komppa
la source
2

Je ne suis pas sûr de votre niveau d'expérience, mais je recommanderais de le faire à la main. Apprendre à faire cela peut demander plus d'efforts, mais il est extrêmement bénéfique de savoir ce que font vos matrices et de pouvoir les manipuler vous-même. Il vous rendra également plus conscient des problèmes qui peuvent survenir lors de l'application de matrices dans différents ordres (par exemple, mise à l'échelle puis rotation). Je sais que j'ai passé de nombreuses heures à essayer de comprendre des "bugs" de rendu étranges avant de décider que mon temps serait mieux passé à étudier en profondeur ce que chaque opération faisait. Cela vaut l'investissement.

Pour résoudre votre problème spécifique, appliquer une transformation aux sommets semble être le moyen le plus simple, sachez simplement l'ordre des opérations des matrices.

kaunartist
la source
1

Le principal problème que je vois est que vous devez accéder aux résultats pour d'autres tâches de jeu et accéder à ces résultats peut être compliqué et lent.

C'est pourquoi je préfère faire ces opérations matricielles moi-même.

bcsanches
la source