À quoi servent les shaders de coque, de domaine et de géométrie?

21

J'ai fait ma juste part de la programmation de jeux 3D pour mon (ancien) employeur, et aussi dans mes propres moteurs personnalisés pour mes propres jeux indépendants.

Au début, j'ai commencé avec Direct3D 9 et D3DX9, qui faisaient à peu près tout pour moi et ne m'obligeaient pas à penser en termes de shaders.

Après cela, j'ai écrit mes premiers shaders Direct3D 9, mais j'ai surtout utilisé un shader très simple pour tout ce que j'ai fait.

Dans la dernière version de mon moteur de jeu, je suis passé à Direct3D 11, et avec cela j'ai créé beaucoup de shaders. J'ai fait le skinning du GPU, les particules calculées par le GPU, beaucoup d'effets d'éclairage et de post-traitement, le tout dans le GPU. Des trucs vraiment cool.

Jusqu'à présent, je n'ai utilisé que des shaders de vertex et de pixel / fragment. Même s'il y a encore beaucoup de choses que je n'ai pas encore faites, je pense avoir une solide connaissance de ce que font les vertex et pixel / fragment shaders, et comment tout cela s'intègre dans l'ensemble du pipeline 3D.

En rattrapant les développements plus récents, je suis devenu très intéressé par les nouvelles étapes de shader. C'est-à-dire le Geometry Shader, et encore plus récent, les shaders Hull et Domain.

Je n'ai jamais utilisé ces étapes, mais d'après ce que je sais, le shader de géométrie, s'il est activé, est exécuté après le vertex shader, une fois pour chaque sommet transformé (ou une fois par primitive?) Et vous permet de supprimer les sommets (et les primitives?) , et en créer de nouveaux (qui, je suppose, remontent au début du pipeline?).

Je suppose que l'utilisation principale du shader de géométrie serait de générer par programmation la géométrie dans le GPU. Une utilisation courante serait de créer des panneaux d'affichage basés sur un seul sommet, mais je ne visualise pas vraiment beaucoup d'autres scénarios courants, à part la génération de fractales et d'autres choses que vous pouvez générer à 100% par programmation.

Quant aux shaders de coque et de domaine, il semble qu'ils soient liés à la tessellation (créant des surfaces plus lisses à partir de surfaces rugueuses?), Et doivent être utilisés ensemble ou pas du tout. Le terme "patch" semble également être courant ici.

Quelqu'un voudrait-il m'expliquer, en termes pratiques, à quoi servent ces nouvelles étapes de shader, comment elles s'intègrent dans le pipeline 3D et dans quels cas devrais-je envisager de les utiliser?

Pyjama Panda
la source
Je pense que vous demandez dans le mauvais sens - plutôt que «à quoi servent-ils», vous devriez demander «que font-ils» - si vous comprenez les ressources données (et leurs concepts sous-capot), seul le ciel limite ce que vous êtes effectivement en mesure de faire avec eux.
wondra
@wondra: C'est presque la même question, mais je voudrais me concentrer davantage sur des exemples d'utilisation pratique, plutôt que sur l'explication théorique de ce qu'ils font. En fait, il y a un aperçu sur le MSDN que j'ai lu plusieurs fois, mais je ne comprends toujours pas ce qu'ils peuvent faire pour moi. Je suis un être intelligent, et je peux connecter A et B, et comprendre C, D, E et F à partir de cela.
Panda Pyjama
Je sais pas, les "exemples pratiques d'utilisation" me paraissent un peu larges. J'ai essayé, mais avant ce commentaire, il se concentre peut-être trop sur "que font-ils" pour vous.
@Josh: Utilisez-vous ou avez-vous utilisé toutes ces étapes dans le monde réel?
Panda Pyjama
1
Un FYI pour ceux qui ont des antécédents non directs (comme moi), ces deux sont appelés "shader de contrôle de tessellation" et "shader d'évaluation de tessellation" dans OpenGL et Vulkan.
Shahbaz

Réponses:

13

Coque et domaines

Les étapes de coque et de shader de domaine font partie du pipeline de tessellation du GPU. Ils sont généralement utilisés pour calculer une géométrie de surface très détaillée basée sur une géométrie de surface d'entrée plus détaillée, qui est définie comme des triangles ou des quads (et cetera). Les primitives d'entrée de moindre détail sont appelées «correctifs», et il est important de noter qu'elles peuvent ne pas représenter la géométrie réelle qui existera éventuellement (bien qu'elles le puissent). Pensez plutôt aux points de contrôle d'une courbe de Bézier, à l'exception d'une surface.

Le shader de coque prend un patch d'entrée et produit un patch de sortie (ou des patchs; c'est là que la subdivision du patch se produit généralement). Des métadonnées constantes sur le patch peuvent également être calculées dans le shader de coque et sorties pour être traitées par les étapes ultérieures du pipeline.

La sortie du shader de coque passe par une étape de pavage (fonction fixe) qui produit des domaines carrelés normalisés du type approprié (par exemple, des quads ou des triangles).

Le shader de domaine est exécuté par rapport à ces domaines afin de calculer la position de sommet réelle de tout point donné dans un domaine résultant de la pavage susmentionné. Le shader de domaine délivre ainsi une position de sommet.

La phase de pavage se produit après l'étape du vertex shader dans le pipeline.

Shaders de géométrie

Les shaders de géométrie sont en quelque sorte comme des shaders de coque / domaine simplifiés. Ils prennent simplement des sommets d'entrée et produisent des sommets de sortie. Pour un sommet d'entrée donné, de nombreux sommets de sortie peuvent être produits, de sorte qu'ils peuvent être utilisés pour «générer une géométrie».

L'étape de shader de géométrie se produit après l'ombrage de vertex et après l'étape de pavage.

Les usages

Le shader de géométrie peut écrire dans des tampons de sortie de flux au lieu d'être directement alimenté dans la phase de tramage et d'ombrage de fragments du pipeline; cela signifie que vous pouvez réexécuter la géométrie produite par une combinaison d'une itération vertex / coque / domaine / géométrie shader dans le pipeline, pour effectuer des travaux supplémentaires dans une autre étape de vertex shader ou autre.

Qu'est - ce que vous pouvez les utiliser pour un assez large, sujet efficace illimitée, donc je ne vais pas vraiment tenter de régler ce problème. Mais pour certaines raisons motivantes d'envisager de les utiliser ... La grande chose au sujet de ces étapes de shader est qu'elles vous permettent d'obtenir potentiellement beaucoup de détails supplémentaires sans payer le coût de la mémoire ou de la bande passante pour tout cela, tout le temps. Et aussi pour déplacer le traitement du CPU vers le GPU.

Le terrain est un bon exemple de l'endroit où vous voudrez peut-être utiliser une partie de cette technologie, car vous devez généralement le voir à la fois très près (car votre personnage se tient dessus) et très loin (les montagnes au loin) et pouvoir contrôler où et combien de détails vous mettez dans la géométrie du terrain "à la volée" via ces étapes de shader est très puissant. Historiquement, les alternatives ont toujours été de payer un coût moyen constant pour le terrain (une approche au plus petit dénominateur commun) ou de paginer manuellement des morceaux de géométrie pour différents niveaux de détail dans et hors de la mémoire du GPU, ce qui est fastidieux et coûteux.

Toute situation similaire où vous pourriez avoir une très large gamme de niveaux de détail dont vous avez besoin pour prendre en charge un maillage ou un modèle qui est également raisonnablement subdivisable peut être un candidat pour faire quelque chose d'intelligent avec ces shaders. Cependant, tout ne se traduit pas bien par une optimisation du style de surface de subdivision . Vous pourriez probablement les utiliser également pour le tissu et les cheveux.

Pour plus de lecture, y compris beaucoup plus de détails que je ne peux raisonnablement me souvenir ou aller ici:


la source
4
Gardez à l'esprit que les shaders de coque et de domaine nécessitent du matériel Direct3D de niveau de fonctionnalité 11.0 ou supérieur, et que les shaders de géométrie nécessitent du matériel de niveau de fonctionnalité Direct3D 10.0 ou supérieur. De plus, la plupart des conceptions de cartes vidéo n'offrent que peu ou pas de matériel dédié au shader de géométrie, de sorte que leur utilité dans la pratique est bien inférieure à ce qu'elles étaient initialement prévues.
Chuck Walbourn
@ChuckWalbourn: J'aimerais vraiment en savoir plus, si vous le souhaitez, dans une réponse séparée
Panda Pyjama