Pourquoi le pipeline programmable (GLSL) est-il plus rapide que le pipeline fixe?

27

Je m'enseigne donc GLSL et j'essaie de comprendre pourquoi il est censé être plus rapide que le pipeline de fonctions fixes.

La raison pour laquelle j'ai un problème est que, d'après ma compréhension, les shaders que vous créez remplacent des sections du pipeline qui étaient là auparavant. Alors, comment fournir simplement votre propre version pour accélérer les choses?

La seule chose que je peux penser, c'est que si vous essayez de fournir votre propre équation d'éclairage auparavant, vous devrez faire le calcul sur le CPU, mais maintenant vous pouvez faire les calculs sur le GPU, ce qui sera plus rapide.

Suis-je bien comprendre?

Joey Green
la source
Vous demandez-vous s'il est plus rapide de créer vos propres versions des fonctions existantes ou s'il est plus rapide de décharger les fonctions que vous calculiez sur le CPU?
MichaelHouse
J'ai trouvé un article sur gamedev.net qui répond à mes questions.
Joey Green
2
Je vois. Vous devriez publier une réponse à ce sujet ici, afin que d'autres puissent en bénéficier. Peut-être clarifier votre question dans le processus.
MichaelHouse
@ joey-green, veuillez lier le gamedev.net ici. Je serais utile aux personnes qui tomberont sur cette question.
Quazi Irfan
1
Pour confondre davantage les choses, dans mes tests, le pipeline fixe peut en fait être plus rapide que les shaders, du moins dans les cas simples; voir sol.gfxile.net/instancing.html
Jari Komppa

Réponses:

27

Les shaders que vous créez ne seront pas votre propre version du pipeline à fonction fixe (FFP), mais une opération de manipulation de vertex et de pixel personnalisée pour réaliser quelque chose de cool et de complexe.

Beaucoup de choses que vous faites via un pipeline programmable (PP) fonctionneront plus rapidement que leurs implémentations FFP possibles, car PP réduit le nombre de passes ou la quantité de magie de combinateur et de cubemap nécessaires pour rendre ces choses hypothétiques dans FFP.

Imaginez mettre en œuvre une chose aussi courante que l'éclairage par pixel dans FFP avec uniquement des données de sommet interpolées et un échantillon de texture entre vos mains. Il n'est même pas possible de le faire "honnêtement", seulement des hacks pour des cas spéciaux en fonction de cubemaps précalculés fidèles et de certains mélanges sérieux. Avec PP, il s'agit de coloriser un produit scalaire entre la direction de la lumière et la normale au sommet.

Dans l'ensemble, le PP devient lent et impossible en rapide et possible. Mais si vous décidez d'écrire un shader pour implémenter les mêmes algorithmes utilisés dans FFP, vous découvrirez que FFP sera légèrement plus rapide car il est très optimisé pour le matériel.

EnoughTea
la source
1
Belle réponse ... +1.
Amir Zadeh
@Green Je n'en suis pas sûr. Manque le point en quelque sorte. La réponse de Kylotan est beaucoup plus appropriée pour la vraie question.
Chris dit de rétablir Monica le
14

En termes théoriques, le pipeline programmable est plus lent que le pipeline de fonctions fixes. Aucun processeur à usage général ne peut rivaliser avec un processeur à boîtier spécial. Le pipeline de fonctions fixes d'origine n'était guère plus qu'un tas de portes logiques dans une ligne aussi rapide que théoriquement possible.

Cependant, de nos jours, le pipeline programmable est la norme. Le matériel est donc plutôt orienté vers le pipeline programmable. Ayant perdu l'efficacité initiale d'avoir un circuit spécialement créé pour un certain flux de données, il doit s'adapter au cas le plus courant, qui est l'approche basée sur les shaders. Cependant, pour les options de compatibilité descendante, le pipeline de fonctions fixes est toujours disponible - mais le coût est que les anciennes fonctions fixes doivent être transposées dans des shaders, ce qui pourrait bien entraîner un coût. Cela expliquerait la différence de performances.

Kylotan
la source
1

La principale raison pour laquelle je pourrais penser est une phase de pipeline fixe, que votre programme n'en a pas besoin. par exemple, imaginez un jeu où toutes les lumières sont statiques, vous pouvez facilement implémenter un shader qui n'essaie même pas de calculer la lumière dynamique. dans ce cas, votre shader s'exécute plus rapidement qu'un shader précompilé qui vérifie la lumière dynamique de certaines équations (un shader à usage général). il existe également d'autres exemples, vous pouvez facilement penser à de nombreux aspects qui devraient être pris en compte pour un pipeline fixe, mais vous pouvez ignorer l'implémentation dans vos propres codes GLSL.

Ali1S232
la source
1

Voilà, vos shaders remplacent des parties du pipeline. Mais souvent, vos shaders sont spécialisés vers un effet spécifique que vous souhaitez obtenir et ne gèrent pas toutes les fonctionnalités spéciales possibles qui pourraient être activées, donc plus simples qu'un shader qui émule le pipeline de fonctions fixes complet. Alors que le chemin d'accès aux fonctions fixes doit prendre en compte de nombreuses choses et fonctionnalités OpenGL que vous pourriez ne pas vouloir utiliser (ou dont vous n'avez même pas entendu parler).

Et les jours où vous avez effectué la fonction fixe dans du matériel spécial (contrairement à un matériel entièrement programmable) sont révolus, ce qui se produit probablement lorsque vous utilisez le pipeline à fonction fixe est que votre pilote charge simplement ses propres shaders spéciaux qui implémentent le chemins à fonction fixe. Mais ceux-ci peuvent être très complexes, pour fournir toutes les fonctionnalités offertes par le pipeline à fonction fixe.

Chris dit de réintégrer Monica
la source
"ce qui se passe probablement lorsque vous utilisez le pipeline à fonction fixe, c'est que votre pilote charge juste ses propres shaders spéciaux qui implémentent les chemins à fonction fixe." ..es-tu sûr de ça? Pouvez-vous fournir une ressource fiable? Merci.
Quazi Irfan
@iamcreasy Je n'ai pas de source fiable (donc probablement), je dois l'admettre. Mais je doute fortement que les cartes graphiques d'aujourd'hui (qui ne sont qu'un tas de nombreux petits processeurs), aient encore du matériel dédié pour calculer l'éclairage ou les calculs de brouillard. Au lieu de cela, il est plus probable qu'ils chargent simplement des programmes précompilés pour cela dans les étapes de shader spécifiques (que ceux-ci proviennent du pilote ou d'un stockage ROM, je ne sais pas).
Chris dit Réintégrer Monica
@iamcreasy selon nouveau wiki nouveau.freedesktop.org/wiki/CodeNames , le pipeline fixe a été supprimé dans GeForce 6xxx.
DirtY iCE
"ce qui se passe probablement lorsque vous utilisez le pipeline à fonction fixe, c'est que votre pilote charge juste ses propres shaders spéciaux qui implémentent les chemins à fonction fixe." Vrai. "Mais ceux-ci peuvent être très complexes, pour fournir toutes les fonctionnalités offertes par le pipeline à fonction fixe." Un bon pilote générera des shaders uniquement pour les fonctionnalités que vous avez activées.
Chris