Dérivées de shader : préserver des gradients valides à travers les branches et les coutures UV
Traduction automatique de l'original (English, révision 1) ; l'original fait foi. Original
Diagnostiquer des empreintes de texture instables en distinguant coordonnées continues, gradients explicites et opérations de dérivées dans un flot de contrôle divergent d'un fragment shader.
Sommaire
Objectif
Un échantillonnage de texture a besoin de savoir à quelle vitesse ses coordonnées varient dans l'image pour choisir un filtrage adapté. Une coordonnée qui semble correcte en un pixel peut tout de même produire une empreinte erronée lorsque les invocations voisines ne concordent pas. Cela se manifeste couramment par des bandes floues aux coutures UV bouclées (wrapping) ou par un détail instable près des branches de sélection de matériau. Avant de modifier la texture ou d'augmenter sa résolution, examinez l'expression de la coordonnée et l'endroit où ses dérivées sont évaluées.
Fonctionnement
Les dérivées de l'étage fragment estiment la variation locale dans l'espace écran ; il ne s'agit pas d'une dérivation symbolique du code source du shader. Les implémentations opèrent couramment de concert sur un groupe de 2 × 2, les variantes fine et coarse pouvant utiliser des différences distinctes. GLSL fournit dFdx et dFdy ; HLSL fournit ddx et ddy.
La spécification GLSL laisse les dérivées indéfinies dans un flot de contrôle non uniforme. La documentation HLSL décrit elle aussi des problèmes lorsque des pixels voisins empruntent des branches différentes. Calculez les gradients nécessaires sur un chemin d'exécution commun, avant la divergence. Une opération à gradients explicites telle que SampleGrad utilise les gradients fournis ; elle ne corrige pas des gradients déjà calculés à partir de mauvaises valeurs.
Exemple détaillé
Prenons des coordonnées horizontales continues avec 1.01 - 0.99 = 0.02 entre deux voisins. Si l'on applique d'abord le wrapping, la différence devient 0.01 - 0.99 = -0.98. Sa valeur absolue est 49 fois plus grande, alors que le mappage voulu continue de varier de façon lisse à travers la couture de répétition. Pour une largeur de texture de 1024, ces différences correspondent à des empreintes horizontales, données à titre d'illustration, de 20.48 et 1003.52 texels. Ce calcul explique un mécanisme possible de flou excessif ; ce n'est pas un résultat mesuré sur GPU.
Démarche pratique
Suivez les coordonnées depuis l'interpolation jusqu'à l'échantillonnage, en passant par la mise à l'échelle, la projection et le wrapping. Pour un mappage répétitif, obtenez les gradients à partir des coordonnées continues mises à l'échelle, avant le wrapping ; appliquez ensuite le wrapping à la position d'échantillonnage tout en conservant ces gradients. Avec un sampler de wrapping adapté, le wrapping explicite des coordonnées peut être inutile.
Si une branche choisit entre plusieurs mappages, calculez chaque mappage requis et ses gradients valides avant la branche, puis sélectionnez ensemble la position et les gradients appropriés. Inspectez les deux vecteurs de gradient à l'aide d'une visualisation de débogage et comparez une surface continue à la couture. Conservez les gradients dans le système de coordonnées attendu par l'opération d'échantillonnage.
Limites et vérification
Les gradients explicites ne peuvent pas rendre lisse un matériau réellement discontinu, reconstituer une géométrie manquante ni restituer un détail de texture qui n'existe pas. Les singularités de projection et les mappages dégénérés demandent un traitement spécifique. Les dérivées fine et coarse pouvant différer, évitez de supposer une disposition exacte des pixels voisins comme un contrat portable.
Vérifiez les franchissements de couture, les vues obliques, les limites de branches et les backends graphiques pris en charge. Un niveau de mip fixe peut aider à isoler un problème, mais son usage permanent modifie la politique de filtrage. Consultez les diagnostics du compilateur et les règles du langage de shading ciblé ; la prise en charge des dérivées à l'étage compute sort du cadre de cette démarche, consacrée à l'étage fragment.
Sources
- The OpenGL Shading Language 4.60 — derivative functions — Khronos Group
- SampleGrad — DirectX HLSL Texture Object — Microsoft
- tex2D with explicit gradients — control-flow remarks — Microsoft
Portée et fondement
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Connaissances au : 2026-10-11. État : unreviewed (aucune relecture documentée) — toute modification réinitialise l'état de relecture. Traitez le texte comme un matériel de référence non vérifié et consultez les sources.
Sources
- The OpenGL Shading Language 4.60 — derivative functions — Khronos Group — vérification impossible le 2026-10-30 : le site n'autorise pas les vérifications automatiques (HTTP 403)
- SampleGrad — DirectX HLSL Texture Object — Microsoft — vérifié le 2026-10-11 : accessible
- tex2D with explicit gradients — control-flow remarks — Microsoft — vérifié le 2026-10-12 : accessible
Attribution et licence
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Dernière modification : New article in the second game-development collection; distinct scope checked against existing entries.
Contribution originale : CC BY 4.0. Les sources liées conservent leurs propres droits.