¿Qué son los derivados del espacio de pantalla y cuándo los usaría?


12

Veo las funciones ddxy ddyglsl 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:

  1. ¿Cuáles son las funciones derivadas del espacio de pantalla?
  2. ¿Qué hacen estas funciones? Los valores de entrada y salida.
  3. ¿Para qué efectos se usan más comúnmente?
  4. ¿Qué tipo de efectos requieren que mires hacia estas funciones?

En el pasado, los he usado para deformaciones de textura, donde la deformación puede hacer que se seleccione el miplevel incorrecto para algunos fragmentos; normalmente un nivel de miplevel más bajo, por lo que puede ver la textura cambiando visiblemente de detalles a medida que se deforma. Tomar los derivados de los texcoords no deformados, luego calcular la deformación, luego usar tex2Dgrad / SampleGrad / textureGrad con los texcoords y derivados deformados evita que esto suceda.
Maximus Minimus

@ LeComteduMerde-fou ¿Qué son las deformaciones de textura? ¿Un rápido google sugiere que te refieres a envolver?
NeomerArcana

No, me refiero a deformaciones , es decir, distorsionar la textura al cambiar las coordenadas de textura con el tiempo.
Maximus Minimus

Ver esta pregunta relacionada . Sin embargo, no creo que sea un duplicado, ya que la pregunta vinculada es preguntar más sobre cómo funcionan estas funciones / cómo se calculan, en lugar de un nivel superior "¿qué es esto y para qué sirve?"
DMGregory

Hola, estoy muy interesado en esto . Actualmente los estoy usando para hacer mapeo de relieve sin una tangente o bitangente, pero básicamente copié y pegué el código. ... Estaba pensando en usarlo para eso ... pero no sé cómo transformar estas derivadas del espacio de pantalla en normales del espacio mundial usando un poco de álgebra lineal barata. Quizás necesito una matriz de proyección inversa de la cámara.
Prokop Hapala

Respuestas:


12

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).

Diagrama que ilustra derivados en un triángulo rasterizado

La derivada del espacio de pantalla de una variable (o expresión) ven 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. ddxes el valor de ven el píxel derecho menos el valor de ven el izquierdo, y de manera similar para ddyel vertical.

Esto responde "¿qué tan rápido vaumenta 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 vaumenta 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 uvdirecció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 tex2Dloden 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)


Cuando dice que es la diferencia entre los píxeles de un lado del bloque de 2x2 al otro, ¿es la diferencia en el valor del píxel o la diferencia en la posición del texel? Si es la diferencia en el valor, ¿resume los texels intermedios o algo así?
NeomerArcana

Es la diferencia en el valor del argumento ( vaquí), 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 ")
DMGregory

Todavía no lo entiendo del todo. Si estoy viendo en ángulo, es posible que el bloque de 2x2 no esté formado por píxeles uno al lado del otro en la textura. Entonces, la diferencia de valores, ¿es la diferencia entre los dos texels seleccionados, o la diferencia entre los dos texels seleccionados teniendo en cuenta los omitidos?
NeomerArcana

Olvídate de los texels: no está probando la textura. Toma el valor literal del argumento que pasó a ddx o ddy, y lo compara con el valor pasado a ddx o ddy al evaluar el fragmento vecino. Si ese valor proviene de una muestra de textura, que así sea, pero las funciones derivadas no tienen ningún conocimiento de las texturas. Solo restan números. Intentaré agregar un diagrama a esta respuesta una vez que regrese a mi PC.
DMGregory

Oh, creo que lo entiendo ahora. Sería genial obtener un diagrama, pero creo que lo entiendo. Estas parecen funciones muy útiles.
NeomerArcana
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.