Para comprender la naturaleza del filtrado anisotrópico, debe tener una comprensión firme de lo que realmente significa el mapeo de texturas.
El término "mapeo de texturas" significa asignar posiciones en un objeto a ubicaciones en una textura. Esto permite que el rasterizador / sombreador, para cada posición en el objeto, obtenga los datos correspondientes de la textura. El método tradicional para hacer esto es asignar a cada vértice de un objeto una coordenada de textura, que asigna directamente esa posición a una ubicación en la textura. El rasterizador interpolará esta coordenada de textura a través de las caras de los diversos triángulos para producir la coordenada de textura utilizada para obtener el color de la textura.
Ahora, pensemos en el proceso de rasterización. ¿Cómo funciona? Toma un triángulo y lo divide en bloques del tamaño de píxeles que llamaremos "fragmentos". Ahora, estos bloques del tamaño de un píxel son del tamaño de un píxel en relación con la pantalla.
Pero estos fragmentos no tienen el tamaño de un píxel en relación con la textura. Imagine si nuestro rasterizador generara una coordenada de textura para cada esquina del fragmento. Ahora imagine dibujar esas 4 esquinas, no en el espacio de la pantalla, sino en el espacio de textura . ¿Qué forma tendría esto?
Bueno, eso depende de las coordenadas de textura. Es decir, depende de cómo se asigne la textura al polígono. Para cualquier fragmento en particular, podría ser un cuadrado alineado con un eje. Puede ser un cuadrado no alineado con el eje. Puede ser un rectángulo. Puede ser un trapecio. Podría ser prácticamente cualquier figura de cuatro lados (o al menos, convexas).
Si estaba accediendo a la textura correctamente, la forma de obtener el color de la textura para un fragmento sería averiguar qué es este rectángulo. Luego, busque cada texel de la textura dentro de ese rectángulo (usando la cobertura para escalar los colores que están en el borde). Luego promedie todos juntos. Eso sería un mapeo perfecto de texturas.
También sería extremadamente lento .
En aras del rendimiento, intentamos aproximarnos a la respuesta real. Basamos las cosas en una coordenada de textura, en lugar de las 4 que cubren el área del fragmento completo en el espacio de texel.
El filtrado basado en Mipmap utiliza imágenes de menor resolución. Estas imágenes son básicamente un acceso directo para el método perfecto, al precalcular cómo se verían los grandes bloques de colores cuando se combinaran. Entonces, cuando selecciona un mipmap más bajo, está utilizando valores precalculados donde cada texel representa un área de la textura.
El filtrado anisotrópico funciona aproximando el método perfecto (que puede y debe combinarse con mipmapping) mediante la toma de un número fijo de muestras adicionales. Pero, ¿cómo calcula el área en el espacio de texel para obtener, ya que todavía solo se le da una coordenada de textura?
Básicamente, hace trampa. Debido a que los sombreadores de fragmentos se ejecutan en bloques vecinos 2x2, es posible calcular la derivada de cualquier valor en el sombreador de fragmentos en el espacio de pantalla X e Y. Luego utiliza estas derivadas, junto con la coordenada de textura real, para calcular una aproximación de cuál sería la huella de textura del verdadero fragmento. Y luego realiza una serie de muestras dentro de esta área.
Aquí hay un diagrama para ayudar a explicarlo:
Los cuadrados en blanco y negro representan nuestra textura. Es solo un tablero de ajedrez de 2x2 tejidos blancos y negros.
El punto naranja es la coordenada de textura para el fragmento en cuestión. El contorno rojo es la huella del fragmento, que se centra en la coordenada de textura.
Los cuadros verdes representan los elementos de texto a los que puede acceder una implementación de filtrado anisotrópico (los detalles de los algoritmos de filtrado anisotrópico son específicos de la plataforma, por lo que solo puedo explicar la idea general).
Este diagrama particular sugiere que una implementación podría acceder a 4 texels. Ah, sí, los cuadros verdes cubren 7 de ellos, pero el cuadro verde en el centro podría extraerse de un mapa MIP más pequeño, obteniendo así el equivalente de 4 texels en una búsqueda. La implementación, por supuesto, ponderaría el promedio de esa búsqueda en 4 en relación con los texel individuales.
Si el límite de filtrado anisotrópico fuera 2 en lugar de 4 (o superior), la implementación seleccionaría 2 de esas muestras para representar la huella del fragmento.