
En gráficos por computadora , el filtrado o suavizado de texturas es el método utilizado para determinar el color de la textura de un píxel mapeado , utilizando los colores de los texeles cercanos (es decir, píxeles de la textura).
El filtrado describe cómo se aplica una textura en diferentes formas, tamaños, ángulos y escalas. Según el algoritmo de filtrado elegido, el resultado mostrará distintos grados de desenfoque, detalle, aliasing espacial , aliasing temporal y bloqueo. Dependiendo de las circunstancias, el filtrado puede realizarse mediante software (como un paquete de renderizado por software ) o hardware, por ejemplo, con circuitos de renderizado en tiempo real o acelerados por GPU , o una combinación de ambos. Para la mayoría de las aplicaciones gráficas interactivas 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é y la precarga , e implementa una selección de algoritmos disponibles para el usuario y el desarrollador.
Existen dos categorías principales de filtrado de texturas: filtrado de magnificació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 los datos dispersos se interpolan para rellenar huecos (magnificación), o un tipo de antialiasing (AA) donde las muestras de textura existen a una frecuencia mayor que la requerida para la frecuencia de muestreo necesaria para el relleno de textura (minimizació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.
La necesidad de filtrar
Durante el proceso de mapeo de texturas para cualquier superficie 3D arbitraria, se produce un error.La búsqueda de textura se realiza para determinar la posición de cada centro de píxel en la textura. Para superficies poligonales con texturas, compuestas por triángulos, típicas de la mayoría de las superficies en juegos y películas 3D, cada píxel (omuestra de píxel subordinada) de esa superficie estará asociado con uno o más triángulos y un conjunto decoordenadas baricéntricas, que se utilizan para proporcionar una posición dentro de la textura. Dicha posición puede no coincidir perfectamente con la cuadrícula de píxeles, lo que requiere una 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 observador, un píxel no suele corresponder directamente a un texel. Es necesario aplicar algún tipo de filtrado para determinar el color óptimo para el píxel. Un filtrado insuficiente o incorrecto se manifestará en la imagen comoartefactos(errores), tales como "bloqueo",bordes dentadoso parpadeo.
Puede haber diferentes tipos de correspondencia entre un píxel y el/los texel/s que representa en la pantalla. Estas dependen de la posición de la superficie texturizada con respecto al observador, y se necesitan diferentes formas de filtrado en cada caso. Dada una textura cuadrada mapeada en una superficie cuadrada en el mundo, a cierta distancia de visualización el tamaño de un píxel de la pantalla es exactamente igual al de un texel. Más cerca, los texels son más grandes que los píxeles de la pantalla y deben escalarse adecuadamente, un proceso conocido como magnificació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 seleccionar un color apropiado en función de los texeles cubiertos, mediante la minificación de textura . Las API gráficas como OpenGL permiten al programador establecer diferentes opciones para los filtros de minificación y magnificación. [ 1 ]
Cabe destacar que, incluso cuando los píxeles y los texeles tienen exactamente el mismo tamaño, un píxel no necesariamente coincidirá exactamente con un texel. Puede estar desalineado o rotado, y abarcar partes de hasta cuatro texeles vecinos. Por lo tanto, sigue siendo necesario algún tipo de filtrado.
Mipmapping
El 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 ella, el patrón de acceso a la memoria durante el muestreo de texturas distantes mostrará una localidad extremadamente deficiente, lo que afectará negativamente al rendimiento incluso si no se realiza ningún filtrado.
Durante la ampliación de texturas, el número de texeles que se deben consultar para cada píxel es siempre cuatro o menos; sin embargo, durante la reducción, a medida que el polígono texturizado se aleja, toda la textura podría reducirse 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 prefiltrando 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 aplicada cambia al tamaño prefiltrado más pequeño. Los diferentes tamaños del mipmap se denominan "niveles", siendo el Nivel 0 el tamaño más grande (utilizado más cerca del observador) y los niveles crecientes se utilizan a distancias crecientes.
Métodos de filtrado
Esta sección enumera los métodos de filtrado de texturas más comunes, ordenados de menor a mayor coste computacional y mejor calidad de imagen.
Interpolación del vecino más cercano
La interpolación del vecino más cercano es el método de filtrado más simple y rudimentario : simplemente utiliza el color del texel más cercano al centro del píxel para determinar el color del píxel. Si bien es simple, esto genera una gran cantidad de artefactos: textura con aspecto de "bloques" durante la ampliación [ 3 ] y aliasing y parpadeo durante la reducción [ 4 ] . Este método es rápido durante la ampliación, pero durante la reducció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 coherentes y la reutilización de líneas de caché [ 5 ] .
Vecino más cercano con mipmapping
Este método sigue utilizando la interpolación del vecino más cercano, pero añade mipmapping : primero se elige el nivel de mipmap más cercano según la distancia, y luego se muestrea el centro del texel más cercano para obtener el color del píxel. Esto reduce significativamente el aliasing y el parpadeo durante la minimización, pero no los elimina por completo. Al hacerlo, mejora el acceso a la memoria de texturas y la reutilización de la línea de caché al evitar pasos de acceso arbitrariamente grandes a través de la memoria de texturas durante la rasterización. Esto no ayuda con el efecto de bloques durante la ampliación, ya que cada texel ampliado seguirá apareciendo como un rectángulo grande.
Filtrado lineal de mipmaps
Con menor frecuencia, OpenGL y otras API admiten el muestreo del vecino más cercano a partir de mipmaps individuales, interpolando linealmente los dos mipmaps más cercanos relevantes para la muestra.
Filtrado bilineal
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 mediante un promedio ponderado según la distancia. [ 6 ] Esto elimina la "bloqueadura" que se observa 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 utiliza para la minificación, a menudo se utiliza con mipmapping; aunque se puede utilizar sin él, sufriría los mismos problemas de aliasing y parpadeo que el filtrado del vecino más cercano cuando se minimiza demasiado. Sin embargo, para relaciones de minificación modestas, se puede utilizar como un supermuestreo de textura ponderado acelerado por hardware de bajo costo.
La Nintendo 64 utilizaba una versión inusual del filtrado bilineal en la que solo se usaban tres píxeles, conocida como filtrado de texturas 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 ]
Filtrado trilineal
El filtrado trilineal es una solución a un problema común en imágenes filtradas bilinealmente con mipmaps: un cambio abrupto y muy notorio en la calidad en los límites donde el renderizador cambia de un nivel de mipmap al siguiente. El filtrado trilineal resuelve esto mediante una búsqueda de textura y un filtrado bilineal en los dos niveles de mipmap más cercanos (uno de mayor y otro de menor calidad), y luego interpolando linealmente los resultados. [ 9 ] Esto produce una degradación suave de la calidad de la textura a medida que aumenta la distancia al observador, en lugar de una serie de caídas repentinas. Por supuesto, a menor distancia que el Nivel 0 solo hay un nivel de mipmap disponible, y el algoritmo vuelve al filtrado bilineal.
Filtrado anisotrópico
El filtrado anisotrópico es el filtrado de mayor calidad disponible en las tarjetas gráficas 3D de consumo actuales . Las técnicas más sencillas, denominadas "isotrópicas", utilizan únicamente mipmaps 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 elevado con respecto a la cámara, el área de relleno de una textura no será aproximadamente cuadrada. Consideremos el caso común de un suelo 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 desenfoque y/o parpadeo, 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 del píxel proyectada en el espacio de textura, y dicha huella no siempre está alineada con el eje de la textura. Además, al tratar con la teoría de muestreo, un píxel no es un pequeño cuadrado [ 10 ] , por lo tanto, su huella no sería un cuadrado proyectado. El ensamblaje de la huella en el espacio de textura muestrea alguna aproximación de la función calculada de un píxel proyectado en el espacio de textura, pero los detalles suelen ser aproximados, [ 11 ] altamente propietarios y arraigados en opiniones sobre la teoría de muestreo. Conceptualmente, el objetivo es obtener una muestra anisotrópica más precisa con la orientación adecuada para evitar el conflicto entre el aliasing en un eje y el desenfoque en el otro cuando el tamaño proyectado difiere.
En las 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.
Filtrado de porcentaje más cercano
El mapeo de sombras basado en profundidad puede utilizar un interesante filtro de porcentaje de proximidad (PCF) con texturas mapeadas en profundidad, lo 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 el renderizado posterior de la escena, este mapa de profundidad se proyecta de nuevo 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 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 a la luz y, por lo tanto, la iluminación por la luz para el píxel renderizado. Así, esta operación de texturizado es una prueba booleana para determinar si el píxel está iluminado; sin embargo, se pueden probar múltiples muestras para un píxel dado y sumar y promediar los resultados booleanos. De esta forma, 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 fluctuación, se puede calcular un promedio o porcentaje de muestras más cercanas y, por lo tanto, iluminadas después de la comparación de profundidad para un píxel. Es fundamental que la suma de los resultados booleanos y la generación de un valor porcentual se realicen después de la comparación de profundidad de la profundidad proyectiva y la obtención de muestras, por lo que esta comparación de profundidad se convierte en una parte integral del filtro de textura. Este porcentaje se puede utilizar para ponderar un cálculo de iluminación y proporcionar no solo 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 posterior a la comparación booleana por distancia [ 14 ]
Véase también
Referencias
- 1 2 "Capítulo 9 - Guía de programación de OpenGL" . Glprogramming.com. 13 de febrero de 2009. Filtrado . Consultado el 14 de enero de 2018 .
- ↑ Williams, Lance (1983). "Pyramidal parametrics" (PDF) . ACM SIGGRAPH Computer Graphics . 17 (3): 1– 11. doi : 10.1145/964967.801126 . ISSN 0097-8930 . Archivado del original (PDF) el 6 de junio de 2016. Consultado el 14 de febrero de 2017 .
- ↑ "Diseño de motores de juego: mapeo de texturas" (PDF) . uncc.edu. Ampliación de texturas. Archivado del original (PDF) el 17 de abril de 2021. Consultado el 14 de febrero de 2017 .
- ↑ "Diseño de motores de juego: mapeo de texturas" (PDF) . uncc.edu. Minificación de texturas. Archivado del original (PDF) el 17 de abril de 2021. Consultado el 14 de febrero de 2017 .
- ↑ Hendrik Lensch (29-11-2007). "Gráficos por computadora: filtrado de texturas y teoría del muestreo" (PDF) . Sociedad Max Planck . MipMaps . Recuperado el 14-01-2018 .
- ↑ Markus Hadwiger (09-03-2015). "GPU y GPGPU Programming Lecture 12: GPU Texturing 2" (PDF) . KAUST . Reconstrucción de texturas: ampliación. Archivado del original (PDF) el 24-01-2021 . Consultado el 14-02-2017 .
- ↑ Markus Hadwiger (09-03-2015). "GPU y GPGPU Programming Lecture 12: GPU Texturing 2" (PDF) . KAUST . Texture Anti-Aliasing: MIP Mapping. Archivado del original (PDF) el 24-01-2021 . Recuperado el 14-02-2017 .
- ↑ "Sistema de videojuegos con coprocesador que proporciona gráficos 3D de alta velocidad y procesamiento de señal de audio digital" . Consultado el 14 de noviembre de 2022 .
- ↑ Hendrik Lensch (29-11-2007). "Gráficos por computadora: filtrado de texturas y teoría del muestreo" (PDF) . Sociedad Max Planck . MipMapping II . Recuperado el 14-01-2018 .
- ↑ Alvy Ray Smith (17 de julio de 1995). "¡Un píxel no es un cuadrado pequeño! (Y un vóxel no es un cubo pequeño) - Memorando técnico 6" (PDF) . cs.princeton.edu . Consultado el 14 de enero de 2018 .
- ↑ Hendrik Lensch (29-11-2007). "Gráficos por computadora: filtrado de texturas y teoría del muestreo" (PDF) . Sociedad Max Planck . Filtrado anisotrópico . Recuperado el 14-01-2018 .
- ↑ Reeves, William T.; Salesin, David H.; Cook, Robert L. (1987-08-01). "Rendering antialiased shadows with depth maps" (PDF) . ACM SIGGRAPH Computer Graphics . 21 (4). Association for Computing Machinery (ACM): 283–291 . doi : 10.1145/37402.37435 . ISSN 0097-8930 . S2CID 18320563. Archivado del original (PDF) el 15 de enero de 2018.
- ↑ Randima Fernando (2008-07-02). "Percentage-Closer Soft Shadows" (PDF) . NVIDIA Corporation . Consultado el 14 de enero de 2018 .
- ↑ "WebGL WEBGL_depth_texture Especificación de extensión ratificada por Khronos" . Khronos.org. 15 de julio de 2014. Consultado el 14 de enero de 2018 .
- Filtrado de texturas
- Gráficos por computadora