Que sont les shaders Vertex et Pixel?
Quelle est la différence entre eux? Lequel est le meilleur?
Un Pixel Shader est un composant GPU (Graphic Processing Unit) qui peut être programmé pour fonctionner sur une base par pixel et prendre soin de choses comme l'éclairage et le bump mapping.
Un Vertex Shader est également un composant GPU et est également programmé en utilisant un langage spécifique de type assemblage, comme les pixel shaders, mais est orienté vers la géométrie de la scène et peut faire des choses comme ajouter des bords de silhouette de cartoony aux objets, etc. .
Ni l'un ni l'autre n'est meilleur que l'autre, ils ont chacun leurs usages spécifiques. La plupart des cartes graphiques modernes prenant en charge DirectX 9 ou mieux incluent ces capacités.
Il existe plusieurs ressources sur le Web pour mieux comprendre comment utiliser ces choses. NVidia et ATI en particulier sont de bonnes ressources pour les documents sur ce sujet.
DirectX 10 et OpenGL 3 ont introduit le Geometry Shader comme troisième type.
Dans le rendu de l'ordre du pipeline -
Vertex Shader - Prend un seul point et peut le régler. Peut être utilisé pour calculer des calculs d'éclairage de vertex complexes en tant que configuration pour la prochaine étape et/ou déformer les points autour (oscillation, échelle, etc.).
chaque primitive résultante est passée à la
Geometry Shader - Prend chaque primitive transformée (triangle, etc.) et peut effectuer des calculs dessus. Cela peut ajouter de nouveaux points, les retirer ou les déplacer selon les besoins. Cela peut être utilisé pour ajouter ou supprimer dynamiquement des niveaux de détail d'un maillage de base unique, créer des maillages mathématiques basés sur un point (pour les systèmes de particules complexes) et d'autres tâches similaires.
chaque primitive résultante est convertie en ligne de balayage et chaque pixel couvert s'étend à travers le
Pixel Shader (Fragment Shader dans OpenGL) - Calcule la couleur d'un pixel à l'écran en fonction de ce que le vertex shader passe, des textures liées et des données ajoutées par l'utilisateur. Cela ne peut pas du tout lire l'écran actuel, il suffit de déterminer quelle couleur/transparence ce pixel doit être pour la primitive actuelle.
ces pixels sont ensuite placés sur le tampon de dessin actuel (écran, backbuffer, rendu à la texture, peu importe)
Tous les shaders peuvent accéder à des données globales telles que la matrice de vision du monde et le développeur peut transmettre des variables simples à utiliser pour l'éclairage ou à toute autre fin. Les shaders sont traités dans un langage de type assembleur, mais les versions modernes de DirectX et d'OpenGL ont intégré des compilateurs de langage de type c de haut niveau intégrés respectivement appelés HLSL et GLSL. NVidia possède également un compilateur de shaders appelé CG qui fonctionne sur les deux API.
[modifié pour refléter l'ordre incorrect que j'avais auparavant (Géométrie-> Sommet-> Pixel) comme indiqué dans un commentaire.]
Il y a maintenant 3 nouveaux shaders utilisés dans DirectX 11 pour la pavage. Le nouvel ordre de shader complet est Vertex-> Hull-> Tessellation-> Domain-> Geometry-> Pixel. Je n'ai pas encore utilisé ces nouveaux donc ne vous sentez pas qualifié pour les décrire avec précision.
Les shaders Vertex et Pixel offrent différentes fonctions dans le pipeline graphique. Les vertex shaders prennent et traitent les données liées aux vertex (positions, normales, texcoords).
Les shaders pixel (ou plus précisément Fragment) prennent des valeurs interpolées à partir de celles traitées dans le shader Vertex et génèrent des fragments pixel. La plupart des trucs "sympas" se font dans des pixel shaders. C'est là que des choses comme la recherche de texture et l'éclairage ont lieu.
spécifique à DirectX:
Shader:
Ensemble de programmes qui implémentent des fonctionnalités graphiques supplémentaires aux objets qui ne sont pas définis dans le pipeline de rendu fixe. De ce fait, nous pouvons avoir nos propres effets graphiques en fonction de nos besoins, c'est-à-dire que nous ne sommes plus limités à des opérations "fixes" prédéfinies.
HLSL: (langage d'ombrage de haut niveau):
HLSL est un langage de programmation comme C++ qui est utilisé pour implémenter des shaders (Pixel Shaders/Vertex Shaders).
Vertex Shaders:
Un vertex shader est un programme exécuté sur le GPU de la carte graphique qui fonctionne sur chaque sommet individuellement. Cela nous permet d'écrire notre propre algorithme personnalisé pour travailler avec les sommets.
Pixel Shaders:
Un pixel shader est un programme exécuté sur le GPU de la carte graphique pendant le processus de pixellisation pour chaque pixel. Il nous donne la possibilité d'accéder/manipuler directement des pixels individuels. Cet accès direct aux pixels nous permet d'obtenir une variété d'effets spéciaux, tels que le multitexturing, l'éclairage par pixel, la profondeur de champ, la simulation de nuages, la simulation d'incendie et les techniques d'ombrage sophistiquées.
Remarque: Les Vertex Shaders et Pixel Shaders (programmes) doivent être compilés à l'aide d'une version spécifique du compilateur avant utilisation. La compilation peut être effectuée comme un appel à une API avec les paramètres requis comme le nom de fichier, la fonction d'entrée principale, etc.,
En termes de développement, un pixel shader est un petit programme qui fonctionne sur chaque pixel individuellement, de la même manière qu'un vertex shader fonctionne sur chaque sommet individuellement.
Ceux-ci peuvent être utilisés pour créer des effets spéciaux, des ombres, un éclairage, etc.
Étant donné que chaque pixel/sommet est exploité individuellement, ces shaders se prêtent à l'architecture hautement parallèle des processeurs graphiques modernes.