Desde la llegada de las primeras tarjetas 3D en el PC que se utiliza lo que llamamos interpolación de texturas. El cual originalmente se utilizó para evitar el efecto de pixelado en las texturas de la escena. De esto se encargan un tipo de unidades llamadas «unidades de manejo de texturas» o abreviadas como unidades de texturas. Os explicamos en qué afecta el rendimiento de vuestras GPU.
Una de las piezas fundamentales en toda GPU es la unidad de texturas, la cual se encarga de colocar en el triángulo de cada escena una imagen, proceso que llamamos texturizado, pero también de lo que llamamos interpolación de texturas.
¿Cómo funciona la interpolación de texturas?
La interpolación de texturas es una función que extiende al mapeado de texturas, este consiste en crear gradientes de color de un píxel hacía otro para así eliminar el efecto de pixelación en la escena. Siendo el más simple el filtro o interpolación bilineal, el cual consiste en coger los 4 píxeles más cercanos a cada pixel para realizar el cálculo de la interpolación.
A día de hoy se utilizan sistemas de interpolación mucho más complejos que el filtro bilineal, los cuales hacen uso de una mayor cantidad de pixeles por muestra. Como es el caso del filtro anisotrópico a varios niveles que pueden llegar a utilizar 8, 16 e incluso 32 muestras por pixel con tal de conseguir una mayor calidad de imagen.
No obstante pese a la existencia de algoritmos de interpolación de texturas más complejos, la gran mayoría del hardware gráfico se encuentra diseñado para el uso del filtro bilineal, el cual es el más barato y fácil de implementar de todos a nivel de hardware y consigue resultados que a día de hoy podríamos considerar gratuitos en lo que al coste computacional se refiere.
Interpolación de texturas y caché de datos
Cuando la unidad de texturas realiza el proceso de tutorización de los polígonos lo que hace es buscar el valor de color almacenado en la textura en memoria, lo aplica sobre el píxel correspondiente, realiza los cálculos correspondientes con el shader o shaders que tenga especificado y el resultado final lo envía a los ROPS para que este se escriba en el búfer de imagen.
En medio de este proceso se realiza la interpolación o filtrado de texturas, pero debido a que se trata de una tarea repetitiva y recursiva. Esta es realizada por lo que llamamos unidad de texturas, la cual se encarga de realizar los diferentes filtrajes. Para ello requiere un alto ancho de banda que aumenta con el número de muestras necesarias por pixel, como mínimo cuatro veces superior por cada texel, que es lo que se requiere para realizar el filtro bilineal.
Las unidades de texturas en las GPU actuales se agrupan de cuatro en cuatro en cada unidad shader o Compute Unit. Esto se traduce en que son necesarios 16 accesos de 32 bits por ciclo de reloj por unidad shader. Es por ello que se utiliza la caché de datos de la misma unidad y su ancho de banda para realizar el filtrado de texturas.
Al mismo tiempo si se requiere utilizar un filtro de texturas de mayor precisión dado que cada unidad de texturas coge sólo 4 muestras por ciclo de reloj entonces es necesario utilizar una mayor cantidad de ciclos de reloj para realizar algoritmos de interpolación de texturas mucho más complejos, reduciendo con ello la tasa de texturizado.
El coste computacional de la interpolación de texturas
A día de hoy las unidades shader son capaces de realizar una enorme cantidad de cálculos por ciclo de reloj, no en vano son capaces de realizar varios TFLOPS, siendo los FLOPS operaciones en coma flotante y la T correspondiente al prefijo Tera, que hace referencia a 10^12 operaciones, por lo que la capacidad de cálculo de las GPU ha aumentado enormemente.
A día de hoy la interpolación de texturas se podría realizar sin problemas haciendo uso de un programa shader dentro de la GPU, lo que en teoría ahorraría por completo la inclusión de las unidades de texturas. ¿Por qué no se hace esto? Pues por el hecho que para compensar la pérdida de dichas unidades de texturas necesitaríamos aumentar la potencia de las unidades de cómputo encargadas de ejecutar los shaders en una forma que sería mucho más costosa. Es decir, necesitaríamos colocar más transistores que los que nos habríamos ahorrado, de ahí a que las unidades de texturas continúen dentro de las GPU tras más de veinte años desde las primera tarjetas 3D y no vayan a desaparecer.
Hay que tener en cuenta que la interpolación de texturas se realiza de manera para todos los texels que se procesen en la escena, lo cual es una cantidad masiva y en especial si hablamos de altas resoluciones como los 1440P o el 4K. Por lo que no resulta rentable eliminarlas del hardware y todo hardware gráfico sin ellas va a tener grandes problemas de rendimiento si prescinde de las mismas, por no olvidar que todos los juegos y aplicaciones ya dan por sentada su existencia.
Limitaciones actuales a la unidad de texturas
Una vez que hemos explicado su utilidad hemos de tener en cuenta cuales son las limitaciones de cara a la unidad de texturas para la interpolación. El formato de texturas habitual es el RGBA8888 donde cada uno de los componentes tiene una precisión de 8 bits y por tanto tiene 256 valores por componente del color.
Esto facilita enormemente la implementación de la interpolación de texturas a nivel de hardware. Ya que pese a que cada unidad de texturas toma los 32 bits de cada píxel a nivel interno desde la caché de datos, cada uno de los cuatro componentes componentes es procesado por separado, en vez de hacerlo de manera conjunta.
¿Los problemas de esta implementación? Cuando la unidad de texturas realiza la interpolación de cada uno de los 4 componentes lo hace utilizando solo 256 valores, lo que pese a facilitar la implementación a nivel de hardware de la interpolación de texturas recorta la precisión de los datos que se pueden obtener, por lo que no acabamos teniendo el resultado ideal de cara a la interpolación, sino una aproximación a la misma.
Dicha falta de precisión en combinación con el hecho de utilizar pocas muestras por pixel provoca que muchas veces en las texturas de los juegos se generan artefactos de imagen que emponzoñan la calidad final de la escena. ¿La mejor solución? Utilizar métodos de interpolación mucho más complejos como la interpolación bicúbica, pero esto supone llevar al hardware a niveles de complejidad mucho más altos de lo que hay ahora, ya que esto requeriría un ancho de banda con la caché de datos cuatro veces superior.