¿Cómo se implementa típicamente el filtrado anisotrópico en las GPU modernas?

14

El filtrado anisotrópico "conserva la nitidez de una textura que normalmente se pierde por los intentos de la textura del mapa MIP de evitar el aliasing". El artículo de Wikipedia da pistas sobre cómo se puede implementar ("sondear la textura (...) para cualquier orientación de anisotropía"), pero no me parece muy claro.

Parece que hay varias implementaciones, como lo sugieren las pruebas ilustradas en las notas de la presentación Modelos aproximados para la representación basada en la física : ingrese la descripción de la imagen aquí

¿Cuáles son los cálculos concretos realizados por las GPU (modernas) para elegir el nivel MIP correcto cuando se utiliza el filtrado anisotrópico?

wip
fuente
3
La especificación para GL_EXT_texture_filter_anisotropices muy detallada. Tal vez podría ayudarlo a comprender mejor el proceso.
glampert

Respuestas:

14

El hardware de filtrado de textura toma varias muestras de los distintos niveles de mipmap (la cantidad máxima de muestras se indica mediante el nivel de filtrado anisotrópico, aunque la cantidad exacta de muestras tomadas en una operación de filtrado dada dependerá de la proporción entre los derivados en el fragmento. ) Si proyecta el cono visualizando una superficie en un ángulo oblicuo sobre el espacio de textura, dará como resultado una proyección de forma ovalada, que es más alargada para ángulos más oblicuos. Se toman muestras adicionales a lo largo del eje de este óvalo (desde los niveles de mip correctos, para aprovechar el prefiltrado que ofrecen) y se combinan para dar una muestra de textura más nítida.

Otra técnica conocida como rip-mapping (mencionada en el artículo de Wikipedia sobre Mipmapping), que no escomúnmente encontrado en las GPU contemporáneas, utiliza prefiltrado de texturas. A diferencia de los mips, la textura no se reduce uniformemente, sino que usa varias proporciones de altura-ancho (hasta una proporción que depende del nivel de filtrado anisotrópico elegido). La variante, o tal vez dos variantes si se usa un filtrado trilineal, de la textura se elige en función del ángulo de la superficie para minimizar la distorsión. Los valores de píxeles se obtienen mediante técnicas de filtrado predeterminadas (bilineales o trilineales). Los mapas de rasgadura no se usan en ningún hardware que conozca debido a su tamaño prohibitivo: mientras que los mapas MIP usan almacenamiento adicional del 33%, los mapas rasgados usan el 300%. Esto se puede verificar observando que los requisitos de uso de textura no aumentan cuando se usa AF, sino que solo lo hace el ancho de banda.

Para leer más, es posible que desee echar un vistazo a la especificación para la extensión OpenGL EXT_texture_filter_anisotropic . Detalla las fórmulas utilizadas para calcular las muestras y cómo combinarlas cuando se utiliza el filtrado anisotrópico.

yuriks
fuente
55
Los mapas RIP probablemente tampoco se usen porque no ayudan en el caso diagonal, bastante común. FWIW, si puede encontrar el código para Microsoft Refrast, la implementación del filtro anistrópico probablemente sea una buena referencia de cómo lo hace el HW de hoy.
Simon F
1
"Esto se puede verificar observando que los requisitos de uso de textura no aumentan cuando se usa AF, sino que solo aumenta el ancho de banda". Argumento asesino. ¡Buena respuesta!
David Kuri
El enlace "Rasterización de software de alto rendimiento en GPU" solo menciona el filtrado anisotrópico de pasada, y no menciona ningún detalle. Así que voy a editarlo de la respuesta porque no creo que sea relevante de una manera útil.
yuriks
@SimonF también podemos agregar que el requisito de ancho de banda adicional es bastante aterrador.
v.oddou
9

Los requisitos de la API se pueden encontrar en cualquiera de las especificaciones o extensiones. Aquí hay uno: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

Es probable que todos los proveedores de GPU se desvíen de la especificación porque la calidad AF solía ser parte de muchos puntos de referencia. Y las implementaciones actuales continuarán evolucionando a medida que las nuevas cargas de trabajo enfaticen las aproximaciones existentes. Desafortunadamente, para saber exactamente qué hace, necesitará ser parte de una de las compañías. Pero puede evaluar el espectro de posibilidades de los siguientes documentos, enumerados en orden creciente de calidad y costo de implementación:

Citando de la especificación:

 Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 
ap_
fuente