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?