Veo las funciones ddx
y ddy
glsl y los equivalentes hlsl aparecen en el código de sombreador de vez en cuando. Actualmente los estoy usando para hacer mapeo de relieve sin una tangente o bitangente, pero básicamente copié y pegué el código. No entiendo cuáles son estas funciones en realidad, qué hacen y cuándo buscaría usarlas.
Entonces preguntas:
- ¿Cuáles son las funciones derivadas del espacio de pantalla?
- ¿Qué hacen estas funciones? Los valores de entrada y salida.
- ¿Para qué efectos se usan más comúnmente?
- ¿Qué tipo de efectos requieren que mires hacia estas funciones?
Respuestas:
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 valorv
(en ese punto del código) de un lado de este quad de 2x2 píxeles al otro. es decir.ddx
es el valor dev
en el píxel derecho menos el valor dev
en el izquierdo, y de manera similar paraddy
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 quev
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 conddx(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)
fuente
v
aquí), y dado que es un quad de 2x2, no hay píxeles en el medio. Entonces, si sombreamos el fragmento superior izquierdo del quad, y v = 1 allí, y en el fragmento superior derecho v = 4, entonces ddx (v) = 3 (diciendo "v aumenta en 3 a medida que avanzamos de izquierda a derecha ")