Primero, es útil saber que las GPU siempre evalúan los sombreadores de fragmentos / píxeles en bloques de píxeles de 2x2 a la vez. (Incluso si solo algunos de esos píxeles finalmente necesitan ser dibujados, mientras que otros están fuera del polígono u ocluidos, los fragmentos innecesarios se enmascaran en lugar de escribirse al final).
La derivada del espacio de pantalla de una variable (o expresión) v
en su sombreador es la diferencia en el valor v
(en ese punto del código) de un lado de este quad de 2x2 píxeles al otro. es decir. ddx
es el valor de v
en el píxel derecho menos el valor de v
en el izquierdo, y de manera similar para ddy
el vertical.
Esto responde "¿qué tan rápido v
aumenta o disminuye a medida que nos movemos horizontalmente (ddx) o verticalmente (ddy) a través de la pantalla?" - es decir. en términos de cálculo, aproxima las derivadas parciales de su variable (aproximada porque usa muestras discretas en cada fragmento, en lugar de evaluar matemáticamente el comportamiento infinitesimal de la función)
Para cantidades escalares, también podemos ver esto como un vector de gradiente ∇v = float2(ddx(v), ddy(v))
que apunta a lo largo de la dirección del espacio de pantalla en el que v
aumenta más rápidamente.
Este tipo de información a menudo se usa internamente para seleccionar un mapa MIP apropiado o un núcleo de filtrado anisotrópico para las búsquedas de textura. Por ejemplo, si mi cámara se ve casi paralela a la uv
dirección vertical de un plano de piso texturizado, ddy(uv.y)
será muy grande en comparación con ddx(uv.x)
(dado que el eje vertical está acortado en la pantalla: un paso de píxeles cubre verticalmente un espacio más largo de textura), que le dice al hardware de muestreo de texturas que necesito un filtro anisotrópico para difuminar la dirección vertical de la textura más que la horizontal para evitar el alias de artefactos.
Para la mayoría de los efectos simples, no necesita usar estos derivados, ya que los métodos básicos de muestreo de textura 2D lo manejan por usted. Pero como Le Comte du Merde-fou menciona en un comentario anterior, cuando está distorsionando sus búsquedas de textura, es posible que necesite recuperar y / o masajear manualmente los derivados del espacio de pantalla para usar, para ayudar al hardware a seleccionar el filtrado apropiado (por ejemplo, a través de tex2Dlod
en HLSL)
Las calcomanías de espacio de pantalla son uno de esos casos, donde un solo bloque de 2x2 puede cubrir una gran discontinuidad de salto en la coordenada de textura calculada, lo que lleva a un borde manchado o alias si deja que el sistema calcule el nivel de filtrado ingenuamente. Este artículo entra en detalles sobre este artefacto y los enfoques para mitigarlo .
Estas derivadas también pueden ser útiles cuando se utilizan funciones de ruido en la generación de texturas procesales. Si, por ejemplo, desea convertir el ruido de procedimiento en un mapa normal, ddx y ddy ofrecen una forma simple, aunque aproximada, de calcular cómo está cambiando el valor del ruido en la vecindad del fragmento actual y en qué dirección está inclinado, de modo que puede construir una normal apropiada.
Las técnicas para representar líneas suavizadas o resaltados de intersección también pueden usar derivados del espacio de pantalla, para garantizar que el grosor / caída sea consistente y no dependa de la geometría o el ángulo de visión.
En esta charla sobre renderizado de arena en Journey , el orador menciona que podrían haber utilizado estas funciones derivadas para controlar cuán brillante es la arena a lo largo de los bordes de mirada ... si hubieran sabido sobre ellos en ese momento (en su lugar, usaron un truco de mapeo, que bajo el capó funciona con este tipo de derivados de todos modos)
Una última nota a tener en cuenta: las derivadas del espacio de pantalla se pueden calcular con precisión "gruesa" / baja (lo que significa que un par de derivadas es compartido por todo el quad) o "fina" / alta precisión (lo que significa que cada píxel se compara con solo su inmediata vecinos en el quad, lo que podría dar cuatro pares derivados distintos sobre el quad). En general, es grueso, pero si nota que está obteniendo bloques visibles de 2x2 en su efecto, es una buena pista que desea cambiar a precisión fina / alta. ;)
(En el diagrama en la parte superior, utilicé cálculos para derivadas finas, pero tenga en cuenta que solo ddx / ddy por sí solo puede predeterminar a derivadas gruesas)