En gráficos por computadora , el filtrado de texturas o el suavizado de texturas es el método utilizado para determinar el color de la textura de un píxel mapeado de textura , utilizando los colores de los texels cercanos (es decir, píxeles de la textura).
El filtrado describe cómo se aplica una textura en muchas formas, tamaños, ángulos y escalas diferentes. Dependiendo del algoritmo de filtro elegido, el resultado mostrará distintos grados de borrosidad, detalle, alias espacial , alias temporal y bloqueo. Dependiendo de 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 en tiempo real o acelerados por GPU , o en una combinación 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 mediante el almacenamiento en caché y la recuperación previa de la memoria , 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 minificación. [1] Dependiendo de la situación, el filtrado de texturas es un tipo de filtro de reconstrucción en el que se interpolan datos dispersos para llenar los huecos (ampliación), o un tipo de suavizado (AA) en el que las muestras de textura existen con una frecuencia mayor que la requerida para la frecuencia de muestreo necesaria para el relleno de textura (minificación).
Existen muchos métodos de filtrado de texturas, que establecen diferentes compromisos entre la complejidad computacional , el ancho de banda de la memoria y la calidad de la imagen.
Durante el proceso de mapeo de textura para cualquier superficie 3D arbitraria, unLa búsqueda de texturas se lleva a cabo para descubrir en qué parte de la textura cae cada centro de píxel. Para superficies poligonales con mapas de textura compuestas por triángulos típicos de la mayoría de las superficies en juegos y películas 3D, cada píxel (omuestra de píxeles subordinados) 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 con respecto al espectador, un píxel normalmente no corresponde directamente a un téxel. Se debe aplicar algún tipo de filtrado para determinar el mejor color para el píxel. Un filtrado insuficiente o incorrecto aparecerá en la imagen comoartefactos(errores en la imagen), como "bloqueos",irregularidadeso brillos.
Puede haber diferentes tipos de correspondencia entre un píxel y el texel/texels que representa en la pantalla. Estos dependen de la posición de la superficie texturizada con respecto al espectador, y en cada caso se necesitan diferentes formas de filtrado. Dada una textura cuadrada asignada a una superficie cuadrada del mundo, a cierta distancia de visualización, el tamaño de un píxel de la pantalla es exactamente igual a un texel. Más cerca que eso, los texels son más grandes que los píxeles de la pantalla y deben ampliarse adecuadamente, un proceso conocido como ampliación de textura . Más lejos, cada texel es más pequeño que un píxel, por lo que un píxel cubre varios texels. En este caso, se debe elegir un color apropiado en función de los texels cubiertos, mediante la minimización de texturas . Las API de gráficos como OpenGL permiten al programador establecer diferentes opciones para los filtros de minificación y ampliación. [1]
Tenga en cuenta que incluso en el caso de que los píxeles y los texels tengan exactamente el mismo tamaño, un píxel no necesariamente coincidirá exactamente con un texel. Puede estar desalineado o girado y cubrir partes de hasta cuatro texels vecinos. Por lo tanto, todavía se requiere alguna forma de filtrado.
Mipmapping es una técnica estándar que se utiliza para ahorrar parte del trabajo de filtrado necesario durante la minificación de texturas. [2] También es muy beneficioso para la coherencia de la 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 textura, la cantidad de téxeles que deben buscarse para cualquier píxel es siempre cuatro o menos; Sin embargo, durante la minificación, a medida que el polígono texturizado se aleja, es posible que toda la textura caiga en un solo píxel. Esto requeriría leer todos sus texels y combinar sus valores para determinar correctamente el color del píxel, una operación prohibitivamente costosa. Mipmapping evita esto filtrando previamente la textura y almacenándola en tamaños más pequeños, hasta un solo píxel. A medida que la superficie texturizada se aleja, la textura que se aplica cambia al tamaño más pequeño prefiltrado. Los diferentes tamaños del mapa MIP se denominan "niveles", siendo el nivel 0 el tamaño más grande (utilizado más cerca del espectador) y los niveles crecientes utilizados a distancias cada vez mayores.
Esta sección enumera 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 básico: 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 da como resultado una gran cantidad de artefactos: textura en "bloques" durante la ampliación, [3] y aliasing y brillo durante la minificación. [4] Este método es rápido durante la ampliación, pero durante la minificación el paso a través de la memoria se vuelve arbitrariamente grande y a menudo puede ser menos eficiente que el mapeo MIP debido a la falta de acceso a texturas espacialmente coherente y reutilización de líneas de caché. [5]
Este método todavía utiliza la interpolación del vecino más cercano, pero agrega mipmapping: primero se elige el nivel de mipmap más cercano según la distancia, luego se toma una muestra del centro de texel más cercano para obtener el color del píxel. Esto reduce significativamente el aliasing y el brillo durante la minificación, pero no los elimina por completo. Al hacerlo, mejora el acceso a la memoria de texturas y la reutilización de las líneas de caché evitando pasos de acceso arbitrariamente grandes a través de la memoria de texturas durante la rasterización. Esto no ayuda con el bloqueo durante la ampliación, ya que cada texto ampliado seguirá apareciendo como un rectángulo grande.
OpenGL y otras API, menos utilizadas, admiten el muestreo del vecino más cercano a partir de mapas MIP individuales al tiempo que interpolan linealmente los dos mapas MIP más cercanos relevantes para la muestra.
En el filtrado bilineal , se muestrean los cuatro texels más cercanos al centro del píxel (en el nivel de mapa MIP más cercano) y sus colores se combinan mediante un promedio ponderado según la distancia. [6] Esto elimina el "bloqueo" que se ve 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 aumento es común. Cuando se usa para minificació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 del vecino más cercano cuando se minimiza demasiado. Sin embargo, para proporciones de minificación modestas, se puede utilizar como una supermuestra de textura ponderada acelerada por hardware y económica.
La Nintendo 64 utilizó una versión inusual de filtrado bilineal en la que sólo se utilizan tres píxeles, conocido 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 un remedio para un artefacto común que se observa en imágenes filtradas bilinealmente mipmapeadas: 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 esto realizando una búsqueda de textura y un filtrado bilineal en los dos niveles de mapa MIP más cercanos (uno de mayor y otro de menor calidad) y luego interpolando linealmente los resultados. [9] Esto da como resultado una suave degradación 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 sólo mapas MIP cuadrados que luego se interpolan mediante filtrado bi o trilineal. ( Isotrópico significa igual en todas las direcciones y, por lo tanto, se usa 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 con respecto a la cámara, el área de relleno de una textura no será aproximadamente cuadrada. Consideremos el caso común del suelo en un juego: el área de relleno es mucho más ancha que alta. En este caso, ninguno de los mapas cuadrados encaja bien. El resultado es borroso y/o brillante, dependiendo de cómo se elija el ajuste. El filtrado anisotrópico corrige esto muestreando la textura como una forma no cuadrada. El objetivo es muestrear una textura para que coincida con la huella de píxeles proyectada en el espacio de textura, y dicha huella no siempre está alineada con el eje de la textura. Además, cuando se trata de teoría de muestras, un píxel no es un pequeño cuadrado [10], por lo que su huella no sería un cuadrado proyectado. El ensamblaje de huellas en el espacio de textura muestra alguna aproximación de la función calculada de un píxel proyectado en el espacio de textura, pero los detalles son a menudo aproximados, [11] altamente patentados y llenos de opiniones sobre la teoría de muestras. Sin embargo, conceptualmente el objetivo es tomar una muestra anisotrópica más correcta y con la orientación adecuada para evitar el conflicto entre el alias 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 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 representa un mapa de profundidad de la escena a partir de la fuente de luz. Durante la representación posterior de la escena, este mapa de profundidad se proyecta nuevamente dentro de 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 muestra de textura obtenida. La coordenada proyectiva será la profundidad de los píxeles de la escena desde 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 tanto, la iluminación de la luz para el píxel renderizado. Por lo tanto, esta operación de texturizado es una prueba booleana de si el píxel está iluminado; sin embargo, se pueden probar varias muestras para un píxel determinado y los resultados booleanos se suman y promedian. 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 fluctuaciones, se puede calcular un promedio o porcentaje de muestras posteriores a la comparación de profundidad 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 recuperación de la muestra, de modo que esta comparación de profundidad se convierta en una parte integral del filtro de textura. Este porcentaje se puede utilizar para ponderar un cálculo de iluminación y proporcionar no sólo un valor booleano de iluminación o sombra, sino también un resultado de penumbra de sombra suave. [12] [13] Una versión de esto es compatible con hardware moderno donde se realiza una comparación y se aplica un filtro bilineal post comparación booleano por distancia [14]