En gráficos de computadora , el filtrado de textura o suavizado de textura es el método utilizado para determinar el color de la textura de un píxel mapeado , utilizando los colores de los texels cercanos (es decir, los píxeles de la textura).
El filtrado describe cómo se aplica una textura en muchas formas, tamaños, ángulos y escalas diferentes. Según el algoritmo de filtrado elegido, el resultado mostrará distintos grados de desenfoque, detalle, aliasing espacial , aliasing temporal y bloqueo. Según las circunstancias, el filtrado se puede realizar en software (como un paquete de renderizado de software) o en hardware, por ejemplo, con circuitos de renderizado acelerados por GPU o en tiempo real , o en una mezcla de ambos. Para las aplicaciones gráficas interactivas más comunes, el filtrado de texturas moderno se realiza mediante hardware dedicado que optimiza el acceso a la memoria a través del almacenamiento en caché de memoria y la búsqueda previa , e implementa una selección de algoritmos disponibles para el usuario y el desarrollador.
Hay dos categorías principales de filtrado de texturas: filtrado de ampliación y filtrado de minimización. [1] Dependiendo de la situación, el filtrado de texturas es un tipo de filtro de reconstrucción donde se interpolan datos dispersos para llenar espacios (ampliación) o un tipo de anti-aliasing (AA) donde las muestras de textura existen a una frecuencia más alta que la requerida para la frecuencia de muestra necesaria para el relleno de textura (minificación).
Existen muchos métodos de filtrado de texturas que implican diferentes compensaciones entre complejidad computacional , ancho de banda de memoria y calidad de imagen.
Durante el proceso de mapeo de textura para cualquier superficie 3D arbitraria, unaLa búsqueda de texturas se realiza para averiguar en qué parte de la textura se encuentra cada centro de píxel. En el caso de superficies poligonales con mapas de textura compuestos de triángulos, típicos de la mayoría de las superficies de los juegos y películas en 3D, cada píxel (omuestra de píxel subordinada) de esa superficie se asociará con algunos triángulos y un conjunto decoordenadas baricéntricas, que se utilizan para proporcionar una posición dentro de una textura. Es posible que dicha posición no se encuentre perfectamente en la "cuadrícula de píxeles", por lo que se necesita alguna función para tener en cuenta estos casos. En otras palabras, dado que la superficie texturizada puede estar a una distancia y orientación arbitrarias en relación con el espectador, un píxel no suele corresponder directamente a un texel. Se debe aplicar algún tipo de filtrado para determinar el mejor color para el píxel. Un filtrado insuficiente o incorrecto se mostrará en la imagen comoartefactos(errores en la imagen), como "bloques",irregularidadeso brillo.
Puede haber diferentes tipos de correspondencia entre un píxel y el/los texel/es que representa en la pantalla. Estos dependen de la posición de la superficie texturizada en relación con el espectador, y se necesitan diferentes formas de filtrado en cada caso. Dada una textura cuadrada mapeada sobre una superficie cuadrada en el mundo, a cierta distancia de visualización el tamaño de un píxel de la pantalla es exactamente el mismo que el de un texel. Más cerca que eso, los texeles son más grandes que los píxeles de la pantalla y necesitan ser ampliados apropiadamente - un proceso conocido como magnificación de textura . Más lejos, cada texel es más pequeño que un píxel, y por lo tanto un píxel cubre múltiples texeles. En este caso, se debe elegir un color apropiado en función de los texeles cubiertos, a través de la minimización de textura . Las API de gráficos como OpenGL permiten al programador establecer diferentes opciones para filtros de minimización y magnificación. [1]
Tenga en cuenta que incluso en el caso en que los píxeles y los texeles tengan exactamente el mismo tamaño, un píxel no necesariamente coincidirá exactamente con un texel. Puede estar desalineado o rotado y cubrir partes de hasta cuatro texeles vecinos. Por lo tanto, sigue siendo necesaria alguna forma de filtrado.
El mapeo mip es una técnica estándar utilizada para ahorrar parte del trabajo de filtrado necesario durante la minimización de texturas. [2] También es muy beneficioso para la coherencia de la memoria caché : sin él, el patrón de acceso a la memoria durante el muestreo de texturas distantes exhibirá una localidad extremadamente pobre, lo que afectará negativamente el rendimiento incluso si no se realiza ningún filtrado.
Durante la ampliación de la textura, la cantidad de texeles que se deben buscar para cualquier píxel es siempre cuatro o menos; sin embargo, durante la minimización, a medida que el polígono texturizado se aleja, es posible que toda la textura se reduzca a un solo píxel. Esto requeriría leer todos sus texeles y combinar sus valores para determinar correctamente el color del píxel, una operación prohibitivamente costosa. El mipmapping evita esto al prefiltrar la textura y almacenarla en tamaños más pequeños hasta un solo píxel. A medida que la superficie texturizada se aleja, la textura que se está aplicando cambia al tamaño más pequeño prefiltrado. Los diferentes tamaños del mipmap se denominan "niveles", siendo el nivel 0 el tamaño más grande (se usa más cerca del espectador) y los niveles crecientes se usan a distancias crecientes.
En esta sección se enumeran los métodos de filtrado de texturas más comunes, en orden creciente de costo computacional y calidad de imagen.
La interpolación del vecino más cercano es el método de filtrado más simple y más rudimentario: simplemente utiliza el color del texel más cercano al centro del píxel para el color del píxel. Si bien es simple, esto genera una gran cantidad de artefactos: texturas en forma de "bloques" durante la ampliación [3] y alias y brillo durante la minimización [4] . Este método es rápido durante la ampliación, pero durante la minimización el paso por la memoria se vuelve arbitrariamente grande y, a menudo, puede ser menos eficiente que el mapeo MIP debido a la falta de acceso a la textura espacialmente coherente y la reutilización de la línea de caché [5] .
Este método sigue utilizando la interpolación del vecino más cercano, pero añade el mapeo MIP: primero se elige el nivel de mapa MIP más cercano según la distancia, luego se toma una muestra del centro del texel más cercano para obtener el color del píxel. Esto reduce significativamente el aliasing y el brillo durante la minimización, pero no los elimina por completo. Al hacerlo, mejora el acceso a la memoria de textura y la reutilización de la línea de caché al evitar pasos de acceso arbitrariamente grandes a través de la memoria de textura durante la rasterización. Esto no ayuda con los bloques durante la ampliación, ya que cada texel ampliado seguirá apareciendo como un rectángulo grande.
Menos utilizadas, OpenGL y otras API admiten el muestreo del vecino más cercano a partir de mipmaps individuales mientras interpolan linealmente los dos mipmaps más cercanos relevantes para la muestra.
En el filtrado bilineal , se muestrean los cuatro texeles más cercanos al centro del píxel (en el nivel de mipmap más cercano) y sus colores se combinan por promedio ponderado según la distancia. [6] Esto elimina el "bloqueo" visto durante la ampliación, ya que ahora hay un gradiente suave de cambio de color de un texel al siguiente, en lugar de un salto abrupto cuando el centro del píxel cruza el límite del texel. [7] El filtrado bilineal para el filtrado de ampliación es común. Cuando se usa para minimización, a menudo se usa con mipmapping; aunque se puede usar sin él, sufriría los mismos problemas de alias y brillo que el filtrado de vecino más cercano cuando se minimiza demasiado. Sin embargo, para proporciones de minimización modestas, se puede usar como una supermuestra de textura ponderada acelerada por hardware de bajo costo.
La Nintendo 64 utilizó una versión inusual de filtrado bilineal en la que solo se utilizan tres píxeles, conocida como filtrado de textura de 3 puntos, en lugar de cuatro debido a problemas de optimización del hardware. Esto introduce un notable "sesgo de triangulación" en algunas texturas. [8]
El filtrado trilineal es una solución a un problema común que se observa en las imágenes filtradas bilinealmente con mapas MIP: un cambio abrupto y muy notable en la calidad en los límites donde el renderizador cambia de un nivel de mapa MIP al siguiente. El filtrado trilineal resuelve este problema haciendo una búsqueda de textura y un filtrado bilineal en los dos niveles de mapa MIP más cercanos (uno de mayor calidad y otro de menor calidad), y luego interpolando linealmente los resultados. [9] Esto da como resultado una degradación suave de la calidad de la textura a medida que aumenta la distancia desde el espectador, en lugar de una serie de caídas repentinas. Por supuesto, más cerca del nivel 0 solo hay un nivel de mapa MIP disponible, y el algoritmo vuelve al filtrado bilineal.
El filtrado anisotrópico es el filtrado de mayor calidad disponible en las tarjetas gráficas 3D de consumo actuales . Las técnicas "isotrópicas" más simples utilizan solo mapas MIP cuadrados que luego se interpolan mediante filtrado bilineal o trilineal. ( Isotrópico significa igual en todas las direcciones y, por lo tanto, se utiliza para describir un sistema en el que todos los mapas son cuadrados en lugar de rectángulos u otros cuadriláteros).
Cuando una superficie está en un ángulo alto en relación con la cámara, el área de relleno para una textura no será aproximadamente cuadrada. Considere el caso común de un piso en un juego: el área de relleno es mucho más ancha que alta. En este caso, ninguno de los mapas cuadrados se ajusta bien. El resultado es borrosidad y/o brillo, según cómo se elija el ajuste. El filtrado anisotrópico corrige esto al muestrear la textura como una forma no cuadrada. El objetivo es muestrear una textura para que coincida con la huella del píxel tal como se proyecta en el espacio de textura, y dicha huella no siempre está alineada con el eje de la textura. Además, cuando se trabaja con la teoría de muestras, un píxel no es un pequeño cuadrado [10], por lo tanto, su huella no sería un cuadrado proyectado. El ensamblaje de huellas en el espacio de texturas muestrea alguna aproximación de la función calculada de un píxel proyectado en el espacio de texturas, pero los detalles a menudo son aproximados, [11] altamente patentados y empapados de opiniones sobre la teoría de muestras. Sin embargo, conceptualmente el objetivo es obtener una muestra anisotrópica más correcta con una orientación apropiada para evitar el conflicto entre el aliasing en un eje y el desenfoque en el otro cuando el tamaño proyectado difiere.
En implementaciones anisotrópicas, el filtrado puede incorporar los mismos algoritmos de filtrado utilizados para filtrar los mapas cuadrados del mipmapping tradicional durante la construcción del resultado intermedio o final.
El mapeo de sombras basado en la profundidad puede utilizar un interesante Filtro de porcentaje más cercano (PCF) con texturas mapeadas en profundidad que amplía la percepción de los tipos de filtros de textura que se pueden aplicar. En PCF, se renderiza un mapa de profundidad de la escena a partir de la fuente de luz. Durante la renderización posterior de la escena, este mapa de profundidad se proyecta nuevamente en la escena desde la posición de la luz y se realiza una comparación entre la coordenada de profundidad proyectiva y la profundidad de la muestra de textura obtenida. La coordenada proyectiva será la profundidad de los píxeles de la escena a partir de la luz, pero la profundidad obtenida del mapa de profundidad representará la profundidad de la escena a lo largo de esa dirección proyectada. De esta manera, se puede determinar la visibilidad de la luz y, por lo tanto, la iluminación por la luz para el píxel renderizado. Por lo tanto, esta operación de texturización es una prueba booleana de si el píxel está iluminado, sin embargo, se pueden probar múltiples muestras para un píxel determinado y se pueden sumar y promediar los resultados booleanos. De esta manera, en combinación con parámetros variables como la ubicación del texel muestreado e incluso la ubicación de la proyección del mapa de profundidad con vibraciones, se puede calcular un promedio posterior a la comparación de profundidad o un porcentaje de muestras más cercanas y, por lo tanto, iluminadas para un píxel. Fundamentalmente, la suma de los resultados booleanos y la generación de un valor porcentual se deben realizar después de la comparación de profundidad de la profundidad proyectiva y la obtención de la muestra, por lo que esta comparación de profundidad se convierte en una parte integral del filtro de textura. Este porcentaje se puede utilizar entonces para ponderar un cálculo de iluminación y proporcionar no solo un valor booleano de iluminación o sombra, sino un resultado de penumbra de sombra suave. [12] [13] Una versión de esto es compatible con el hardware moderno donde se realiza una comparación y se aplica un filtro bilineal de comparación booleana posterior por distancia [14]