Así funciona el FSR, FSR 2.0 y FSR 3.0: la contrapartida sin IA al DLSS de NVIDIA
El FSR o FidelityFX Super Resolution es la respuesta de AMD a NVIDIA DLSS, considerada la primera por unos como una mejor solución al ser compatible con todo tipo de hardware, y por otros, como un sucedáneo de peor calidad. Sea cual sea la opinión sobre el mismo, no vamos a entrar a ello, lo que haremos es explicaros qué es y cómo funciona este algoritmo de aumento de resolución que en su última versión ha decidido dar el salto a "inventarse" (crear) frames de la misma manera que su rival. Igualmente, ya que vemos FSR como tal, explicaremos las novedades de sus variantes FSR 2.0 y FSR 3.0.
El concepto de los algoritmos de aumento de resolución parte del hecho de que el coste en tiempo para renderizar una escena a menos resolución es mucho más bajo. Por ello, esto cobra todo el sentido del mundo cuando una tarjeta gráfica no consigue llegar a la tasa de frames deseada, pero es un arma de doble filo que puede llegar a hacer que los títulos terminen saliendo menos optimizados, algo que, por desgracia, ya está ocurriendo con algunos juegos de PC y consola. Pero, ¿es realmente culpa del FSR? No creemos, pero, por el momento, nos centraremos en explicaros cómo funciona.
¿Qué es el FSR?
FSR son las siglas de FidelityFX Super Resolution y se trata de una serie de técnicas producidas por AMD para la reconstrucción de imágenes a tiempo real a resoluciones más altas, es decir, con una mayor cantidad de píxeles, respecto a la imagen original.
Por lo que en principio tiene la misma utilidad que el DLSS de NVIDIA, pero en lo que se diferencian es en la forma de obtener sus objetivos. Mientras que la solución para las RTX utiliza un tipo de red neuronal llamada Convolutional Autoencoder, en el caso del FSR se usan shaders de computación ejecutándose en paralelo al renderizado el frame original para reconstruirlo a una mayor resolución.
Diferencias con el DLSS
Hay varios puntos que diferencian ambas propuestas, lo suficiente como para ser consideradas dos soluciones distintas para un mismo problema, las cuales son las siguientes:
- El DLSS es un
algoritmo de aprendizaje profundo, por lo que cada juego en su
desarrollo requiere entrenamiento en los servidores de
NVIDIA para usarlo.
- El FSR, en cambio, es un algoritmo de computación de propósito general en las GPU, y, por tanto, no requiere de entrenamiento.
- Si hablamos del algoritmo de NVIDIA, este es
dependiente no solo del uso de arrays sistólicos/Tensor Cores, sino
también de los suyos propios, desde el momento en que las
Intel ARC disponen de unidades de este tipo y no
pueden ejecutarlo.
- El FSR emplea las unidades SIMD que tiene toda GPU contemporánea para funcionar, permitiendo que funcione en todo tipo de hardware.
En el ámbito del marketing, el DLSS es más efectivo que el FSR por el hecho que se suele asociar a los juegos de lanzamiento y del momento, de ahí a que esté en la boca de todos. La propuesta de AMD, en cambio, al ser de código abierto, puede ser implementada por todo el mundo de forma libre e incluso ser modificada.
Esto supone un esfuerzo adicional por parte de los desarrolladores, pero al mismo tiempo supone que la comunidad de mods pueda utilizar el FidelityFX Super Resolution, incluso en emuladores.
¿Cómo funciona?
El primer paso consiste en generar la imagen de la escena a menos resolución que la que queremos obtener de salida, esto en principio es el objetivo del propio FSR, el poder generar el frame a una menor resolución supone un ahorro en recursos de la tarjeta gráfica, tanto en potencia de computación, como en memoria.
En concreto, dependiendo de la diferencia en la cantidad de píxeles entre la resolución de renderizado original y la de salida, tenemos los siguientes niveles de calidad para el FSR:
- Rendimiento: x2 por dimensión.
- Equilibrado: x1,7 por dimensión
- Calidad: x1.7 por dimensión.
- Ultra Calidad: x1,3 por dimensión.
Durante el proceso de renderizado del frame a menor resolución solo habrá un búfer que se renderizará a la resolución objetiva, es decir, la que queremos obtener de salida, este es el Z-Buffer o búfer de profundidad, el cual le servirá a la GPU como lienzo base para la creación de la escena posterior.
Por ello, consistirá en ir rellenando los diferentes píxeles con los valores de color correspondientes, pero de entrada el sistema se encontrará con qué desconocerá el valor de color de buena parte de los píxeles.
Interpolación y Lanczos
El paso siguiente es conseguir el valor de color de cada uno de los píxeles desconocidos cercanos a los sí conocidos, para ello se utiliza un algoritmo de interpolación donde se obtiene el color de cada píxel desconocido tomando como referencia a los colindantes.
A esto se le llama interpolación. Sin embargo, su resultado no es del todo satisfactorio y es aquí donde entra un algoritmo clásico del álgebra lineal llamado Lanczos, y como todo lo relacionado con esta rama de las matemáticas, este se adapta como anillo al dedo a las capacidades de las unidades SIMD de una GPU.
No vamos a explicar matemáticamente el algoritmo, solo diremos que toma como referencia la imagen generada originalmente a menos resolución para realizar las correcciones de color correspondientes al valor final. Lo que le da una mayor calidad de imagen que un método de interpolación simple, pero está muy lejos en calidad de imagen a uno generado por Deep Learning. Y es que el gran problema del FSR 1.0 era ni más ni menos que usaba solo una imagen para obtener los datos.
FSR 2.0
La segunda versión del FidelityFX Super Resolution trajo consigo una novedad copiada del DLSS 2.0, el añadido de la temporalidad, lo que supone el uso de la información de fotogramas anteriores para mejorar la calidad de la información, es decir, para que el frame con FSR 2.0 sea lo más parecido posible a la generación nativa.
Para ello, al igual que en el DLSS, crea un ID Buffer que indica donde se encuentra un objeto en cada fotograma para poder extraer información relacionada con el mismo como complementaria durante la ejecución del algoritmo Lanczos.
Si bien sigue sin utilizar nada de Deep Learning, el truco para conseguir generar las imágenes en el FSR 2.0 utiliza en parte los mismos vectores de velocidad que en el DLSS 2.0, es por ello que en muchos títulos ya compatibles con el algoritmo de aumento de resolución de NVIDIA se usan esos mismos datos para el empleo del FSR 2.0. En especial si la obtención se ha hecho a través de un Compute Shader general. Dicha versión supuso un aumento de calidad de imagen general en los algoritmos FSR y lo catapultaron a ser una alternativa viable al DLSS de NVIDIA.
FSR 3.0
La versión más nueva del FSR, FSR 3.0, añade la generación automática de frames intermedios, para ello no se basa en ninguna pieza de hardware exclusiva como es el Optical Flow Accelerator en las RTX 40, sino por computación pura y dura, Es decir, toma la información de dos fotogramas sucesivos y genera lo que AMD llama Fluid Motion Frame, sin embargo, la tasa de velocidad ha de ser al menos de 60 frames por segundo para funcionar bien.
El truco del FSR 3.0 es sencillo, teniendo en cuenta la información del primer frame, tan pronto como se genera el segundo, concretamente en la fase de rasterización, donde se conoce la posición de los objetos en pantalla, es cuando se empieza a crear el fotograma intermedio, el cual se generará con la información de ambos frames por segundo.
Esta es la versión más avanzada del FSR, es decir FSR 3.0, al igual que el DLSS 2.0 y 3.0, este genera algunos problemas de fidelidad visual con el Ray Tracing, ya que la iluminación puede cambiar con cada fotograma. Por otro lado, hemos de tener en cuenta el tema del input lag, el hecho de que haya una tasa de frames más alta no supone que el tiempo de respuesta visual a nuestras acciones aumente, sino que continuará siendo de lenta o rápida que sin el uso de la generación automática de fotogramas.