Integer Scaling: Qué es y cómo funciona
En este artículo vamos a tratar en profundidad una nueva tecnología denominada Integer Scaling, la cual hemos podido ver recientemente implementada en los últimos chips gráficos de Intel y NVIDIA y que permite evitar el emborronamiento de las imágenes al aumentarlas con un filtro antialiasing de por medio, algo que si bien es la norma hoy en día, son muchos los usuarios que quieren evitarlo cuando por ejemplo tenemos entre manos gráficos del tipo pixel art que confían en un aspecto muy cuadrado a la hora de obtener su característico estilo, que viene puramente de parte de los pixeles al aumentar su tamaño.
Como ocurre en prácticamente cualquier desarrollo, para crear una solución necesitamos primero un problema al que enfrentarnos, y en este caso el reescalado responde a la necesidad de adaptar una imagen con una resolución determinada a la resolución a la que la deseamos ver, ya sea a pantalla completa o no.
En este caso, nos centraremos en las diferencias que hay entre el escalado tradicional con filtro de suavizado, el cual es apto para aumentos leves de tamaño en los que el suavizado permite obtener una mejora de calidad respecto a una imagen sin suavizar, mientras que a la hora de aumentar el tamaño de una imagen en varios enteros este suavizado puede reducir la calidad en tal medida que nos quedemos con una imagen inutilizable.
El Integer Scaling, definido por Intel, es una técnica de escalado que simplemente escala los pixeles existentes con un multiplicador en forma de número integro, es decir, un número que se puede escribir sin un componente decimal. Por ejemplo, 2 o 4 son íntegros que este tipo de escalado puede usar, mientras que cifras negativas o con decimales serán completamente invalidas.
Escalado x8 en Integer Scaling
Este escalado usa un algoritmo de interpolación del tipo “vecino más cercano” (Nearest Neighbor), también denominado de interpolación proximal, y permite introducir la información que falta debido a la redimensión de la imagen partiendo de la información original, colocando el color asociado al pixel original más cercano al pixel objetivo. En este enlace podemos ver una demostración de cómo funciona
La implementación de reescalado que hemos tenido durante años se basa en la aplicación de un filtro de antialiasing que suaviza los bordes de la imagen redimensionada, principalmente emborronando los bordes de los píxeles y manteniendo una idea más en línea con lo que obtendríamos si la resolución original de la imagen fuese mayor.
Escalado x8 con filtro bilineal (técnica actual)
Esto tiene sus ventajas, sobre todo cuando trabajamos en aumentos de tamaño no muy grandes, donde la calidad percibida no es muy inferior a la imagen original y puede funcionar muy bien en cuanto a iconos y otros gráficos se refiere, pero suele ser un problema cuando queremos aumentar el tamaño de la imagen en varias magnitudes, provocándose un efecto contrario al deseado y generalmente proporcionándonos una imagen resultante inutilizable.
Como hemos mencionado anteriormente, el Integer Scaling hace uso de un algoritmo de interpolación proximal que aumenta varias magnitudes la claridad de una imagen aumentada respecto al método actual de redimensionado de imágenes, eliminando el componente borroso que en muchas ocasiones se manifiesta al aumentar una imagen, debido al uso de un filtro de suavizado de bordes
Podemos notar el aumento de claridad, sobretodo en el texto de la parte superior
De esta forma, en vez de buscar valores intermedios para los pixeles inexistentes en la imagen original, se obtiene una imagen completamente escalada 1:1 a partir de la imagen original, tanto en dimensiones como en color, a diferencia de lo que podemos obtener a partir de un filtro bilineal usado en la actualidad en la mayoría de aplicaciones y equipos.
Cabe mencionar que esta técnica de reescalado no tiene ninguna penalización en el rendimiento del equipo dado que se usa el motor de reescalado de la propia GPU, y en todo caso podría mejorar potencialmenente el rendimiento al no tener que aplicar un paso extra de filtrado de la imagen.
Las razones son variadas, pero con el auge de los contenidos con estética retro o Pixel Art, son miles los creadores y usuarios que han visto como la calidad de dichos contenidos se ve totalmente mermada debido al uso de un filtro que suaviza los bordes de los pixeles aumentados, reproduciéndolos de forma distinta a lo que obtendríamos con los gráficos originales en hardware original.
Los sprites de los personajes de consolas antiguas podían llegar a resoluciones de 16x16 píxeles, mientras que esta imagen mide 512 píxeles.
Aumentar la fidelidad visual de los juegos es una de las metas de los fabricantes de hardware gráfico, razón por la que han escuchado las quejas de los usuarios y finalmente han implementado este modo de escalado, que nos permite ver por ejemplo sprites con una resolución de 16x16 pixeles en un monitor FullHD o 4K sin una pérdida en la nitidez de dicho sprite incluso tras aumentarlo, pues por su propia naturaleza dicho sprite tenía una apariencia pixelada que le proporcionaba su estilo único.
Esta imagen con tamaño original de 150x100 píxeles tiene un escalado 5x, a la izquierda con filtro bilineal, a la derecha escalado por aproximación
Un estilo artístico que está en auge también es el Pixel Art, un estilo de dibujo que se realiza generalmente en forma de imágenes de poca resolución de forma deliberada y que, en teoría, permite que una vez escalado se siga apreciando un estilo único que depende del dibujante y que mantiene la estética de los juegos retro que a millones de personas apasiona alrededor del mundo.
Como era de esperar, este tipo de escalado viene con sus pros y sus contras, encontrando entre las principales ventajas las ya mencionadas como serían una gran claridad en las imágenes redimensionadas o el hecho de mantener intacta la visión del artista original de dicho contenido en vez de modificarla con filtros que reducen la nitidez de la imagen.
Por otro lado, podemos comentar alguna que otra desventaja, y es que al tener que utilizar integros para el escalado de las imágenes, tendremos menos control sobre el tamaño final de la imagen dado que no existirán niveles intermedios de escalado. Esto nos lleva a otro problema implícito, y es que a la hora de jugar a juegos retro o que no cuenten con soporte nativo para la resolución a la que estamos jugando, es muy posible que terminemos con bordes negros alrededor de toda la imagen debido a que en ocasiones no podremos ajustarnos a la resolución de nuestra pantalla.
Intel proporciona algunos ejemplos de este problema, donde por ejemplo un juego que se ejecuta a una resolución de 640x480 pixeles (ratio de aspecto 4:3) en una pantalla con resolución 3840x2160 (relación de aspecto 16:9) verá necesario forzar el Integer Scaling para obtener una imagen a 2560x1920 rodeada de bordes negros, donde una imagen escalada con interpolación bilinear contaría con una imagen de 2880x2160 pixeles y bordes negros solamente a los lados.
Otro ejemplo es la ejecución de un juego a 800x600 pixeles en un monitor con resolución 1920x1080, donde no es posible encajar la imagen escalada por un integro mayor a 1 sin salirnos de la resolución real de nuestra pantalla. En este caso, el juego se ejecutaría a su resolución original, centrado en el panel y rodeado de bordes negros.
Por ahora solo Intel y NVIDIA soportan Integer Scaling en sus controladores, de forma que los usuarios de tarjetas gráficas o sistemas basados en APUs AMD no podrán activar esta función en los controladores, ni tan siquiera en las ultimas GPU de la compañía basadas en silicios Navi, Vega o Polaris.
NVIDIA soporta Integer Scaling en equipos que monten una tarjeta gráfica con GPU Turing (GTX 16 Series y RTX 20 Series) y el controlador gráfico de NVIDIA a partir su versión 436.02 WHQL sobre Windows 10 April 2018 Update o posterior.
Intel soporta Integer Scaling en equipos que monten un procesador Ice Lake con gráficos integrados Gen11 Iris Pro o posterior y el controlador de gráficos integrados Intel en su versión 25.20.100.7155 BETA o posterior.
Estas opciones pueden habilitarse en los respectivos paneles de control de cada marca, donde en NVIDIA tendremos que dirigirnos al menú de Pantalla > Ajustar el tamaño y la posición del escritorio > Escalado.
Del mismo modo, en Intel tendremos que dirigirnos al Graphics Command Center, y en sus ajustes globales encontraremos la opción Retro Scaling, donde la opción de ancho fijo (Fixed Width) nos proporcionará los mejores resultados al utilizar Integer Scaling.
Si bien esta implementación del Integer Scaling en juegos es novedosa en PC, no hay que olvidar que la mayoría de televisores, consolas y demás terminan haciendo uso de suavizado para mejorar la calidad, algo que en ocasiones no nos interesa. Es por ello que determinadas compañías han desarrollado hardware para mejorar la calidad aplicando técnicas similares al Integer Scaling.
Por ejemplo, el Marseille mClassic es un adaptador HDMI con un chip Marseille VTV-1224 dedicado en su interior que permite conectar las antiguas consolas con resoluciones muy por debajo de lo que estamos acostumbrados hoy en día y lanzar dicha señal a un televisor 4K en forma de señal nativa, de forma que nos saltamos el escalado del televisor y contamos con una imagen mucho más limpia y fiel a la original.
Asimismo podemos comprobar por nosotros mismos como en Adobe Photoshop tenemos distintas opciones a la hora de escalar contenidos, permitiéndonos elegir el modo de remuestrear por aproximación que sería el modo más parecido al Integer Scaling, evitando asi cualquier emborronamiento causado por el uso de filtros.