Que sont les dérivés de l'espace d'écran et quand les utiliserais-je?

12

Je vois les fonctions ddxet ddyglsl et les équivalents hlsl apparaissent de temps en temps dans le code shader. Je les utilise actuellement pour faire du bump mapping sans tangente ni bitangente mais j'ai essentiellement copié-collé le code. Je ne comprends pas ce que sont réellement ces fonctions, ce qu'elles font et quand je chercherais à les utiliser.

Alors des questions:

  1. Quelles sont les fonctions dérivées de l'espace d'écran?
  2. Que font ces fonctions? Les valeurs d'entrée et les valeurs de sortie
  3. Pour quels effets sont-ils le plus souvent utilisés?
  4. Quels types d'effets nécessitent que vous regardiez ces fonctions?
NeomerArcana
la source
Dans le passé, je les utilisais pour les déformations de texture, où la déformation pouvait entraîner la sélection du mauvais niveau multiple pour certains fragments; généralement un niveau multiple inférieur, de sorte que vous pouvez voir la texture se déplacer très visiblement en détail lorsqu'elle se déforme. Prendre les dérivés des texcoords non déformés, puis calculer la déformation, puis utiliser tex2Dgrad / SampleGrad / textureGrad avec les texcoords déformés et les dérivés empêche que cela se produise.
Maximus Minimus
@ LeComteduMerde-fou que sont les déformations de texture? Un rapide Google suggère que vous voulez dire envelopper?
NeomerArcana
Non, je ne veux funes , déformant la texture par exemple en changeant la texture coords au fil du temps.
Maximus Minimus
Voir cette question connexe . Je ne pense pas que ce soit tout à fait un double, car la question liée demande plus sur la façon dont ces fonctions fonctionnent / comment elles sont calculées, au lieu d'un niveau supérieur "qu'est-ce que c'est et à quoi ça sert?"
DMGregory
Bonjour, je suis très intéressé par cela, je les utilise actuellement pour faire du bump mapping sans tangente ou bitangente, mais j'ai essentiellement copié-collé le code. ... Je pensais à l'utiliser pour ça ... mais je ne sais pas comment transformer ces dérivées de l'espace d'écran en normales de l'espace mondial en utilisant une algèbre linéaire bon marché. J'ai peut-être besoin de l'inverse de la matrice de projection de la caméra.
Prokop Hapala

Réponses:

12

Tout d'abord, il est utile de savoir que les GPU évaluent toujours les shaders fragment / pixel sur des blocs de 2x2 pixels à la fois. (Même si seuls certains de ces pixels doivent finalement être dessinés, tandis que d'autres sont en dehors du polygone ou occlus - les fragments inutiles sont masqués au lieu d'être écrits à la fin).

Diagramme illustrant les dérivés dans un triangle tramé

La dérivée de l'espace d'écran d'une variable (ou expression) vdans votre shader est la différence de valeur v(à ce point dans le code) d'un côté de ce quad 2x2 pixels à l'autre. c'est à dire. ddxest la valeur de vdans le pixel droit moins la valeur de vdans la gauche, et de même pour ddyla verticale.

Cela répond "à quelle vitesse vaugmente ou diminue lorsque nous nous déplaçons horizontalement (ddx) ou verticalement (ddy) sur l'écran?" - c'est à dire. en termes de calcul, il rapproche les dérivées partielles de votre variable (approximative car elle utilise des échantillons discrets à chaque fragment, plutôt que d'évaluer mathématiquement le comportement infinitésimal de la fonction)

Pour les quantités scalaires, nous pouvons également voir cela comme un vecteur de gradient ∇v = float2(ddx(v), ddy(v)) qui pointe le long de la direction de l'espace d'écran dans lequel vaugmente le plus rapidement.

Ce type d'informations est souvent utilisé en interne pour sélectionner une mipmap appropriée ou un noyau de filtrage anisotrope pour les recherches de texture. Par exemple, si mon appareil photo semble presque parallèle à la uvdirection verticale d'un plan de sol texturé, ddy(uv.y)il sera très grand par rapport à ddx(uv.x)(puisque l'axe vertical est raccourci sur l'écran - une foulée de pixels recouvre verticalement une plus longue étendue d'espace de texture), ce qui indique au matériel d'échantillonnage de texture que j'ai besoin d'un filtrage anisotrope pour brouiller la direction de texture verticale plus que l'horizontale pour éviter les artefacts d'alias.

Pour la plupart des effets simples, vous n'avez pas besoin d'utiliser ces dérivés, car les méthodes d'échantillonnage de texture 2D de base le gèrent pour vous. Mais comme Le Comte du Merde-fou le mentionne dans un commentaire ci-dessus, lorsque vous déformez vos recherches de texture, vous devrez peut-être récupérer et / ou masser manuellement les dérivés de l'espace d'écran à utiliser, pour aider le matériel à sélectionner le filtrage approprié (par exemple via tex2Dloden HLSL)

Les décalcomanies de l'espace d'écran sont un de ces cas, où un seul bloc 2x2 peut couvrir une grande discontinuité de saut dans la coordonnée de texture calculée, conduisant à un bord taché ou aliasé si vous laissez le système calculer le niveau de filtrage naïvement. Cet article décrit en détail cet artefact et les approches pour l'atténuer .

Ces dérivés peuvent également être utiles lorsque vous utilisez des fonctions de bruit dans la génération de texture procédurale. Si, par exemple, vous vouliez transformer le bruit procédural en une carte normale, ddx & ddy donnent un moyen simple, si approximatif, de calculer comment la valeur du bruit change au voisinage du fragment actuel, et de quelle façon il est en pente, donc vous peut construire une normale appropriée.

Les techniques de rendu des lignes anticrénelées ou des reflets d'intersection peuvent également utiliser des dérivés d'espace d'écran, pour garantir que l'épaisseur / l'atténuation est cohérente et ne dépend pas de la géométrie ou de l'angle de vue.

Dans cet exposé sur le rendu du sable dans Journey , le conférencier mentionne qu'il aurait pu utiliser ces fonctions dérivées pour contrôler l'étincelle du sable le long des bords brillants ... s'ils l'avaient connu à l'époque (à la place, ils ont utilisé une astuce de mipmapping, qui sous le capot est alimenté par ces types de dérivés de toute façon)

Une dernière remarque à prendre en compte: les dérivés de l'espace d'écran peuvent être calculés à "grossier" / faible précision (ce qui signifie qu'une paire de dérivés est partagée par l'ensemble du quad) ou "fin" / haute précision (ce qui signifie que chaque pixel n'est comparé qu'à son immédiat voisins dans le quad, ce qui pourrait donner quatre paires de dérivées distinctes sur le quad). Le grossier est généralement suffisant, mais si vous remarquez que vous obtenez des blocs 2x2 visibles dans votre effet, c'est un bon indice que vous souhaitez passer à la précision fine / haute. ;)

(Dans le diagramme en haut, j'ai utilisé des calculs pour les dérivés fins, mais attention, juste ddx / ddy seuls peuvent par défaut être des dérivés grossiers)

DMGregory
la source
Quand vous dites que c'est la différence entre les pixels d'un côté du bloc 2x2 à l'autre, est-ce la différence de valeur de pixel ou la différence de position de texel? Si c'est la différence de valeur, cela résume-t-il les texels entre les deux ou quelque chose?
NeomerArcana
C'est la différence de valeur de l'argument ( vici), et comme c'est un quad 2x2, il n'y a pas de pixels entre les deux. Donc, si nous ombrons le fragment en haut à gauche du quad, et v = 1 là-bas, et dans le fragment en haut à droite v = 4, alors ddx (v) = 3 (en disant "v augmente de 3 à mesure que nous nous déplaçons de gauche à droite ")
DMGregory
Je ne comprends toujours pas très bien. Si je regarde sous un angle, le bloc 2x2 peut ne pas être composé de pixels côte à côte dans la texture. Donc la différence de valeurs, est-ce la différence entre les deux texels sélectionnés, ou la différence entre les deux texels sélectionnés en tenant compte de ceux sautés?
NeomerArcana
Oubliez les texels - ce n'est pas l'échantillonnage de la texture. Cela prend la valeur littérale de l'argument que vous avez passé à ddx ou ddy et la compare à la valeur passée à ddx ou ddy lors de l'évaluation du fragment voisin. Si cette valeur venait d'un échantillon de texture, qu'il en soit ainsi, mais les fonctions dérivées n'ont aucune connaissance des textures. Ils soustraient juste les nombres. J'essaierai d'ajouter un diagramme à cette réponse une fois de retour sur mon PC.
DMGregory
Oh je pense que je comprends maintenant. Ce serait génial d'avoir un diagramme mais je pense que je comprends. Ces fonctions semblent très utiles.
NeomerArcana