Avec son FidelityFX Super Resolution (FSR), AMD a introduit une solution simple et efficace pour améliorer la définition d'une image dans le domaine des jeux vidéo. Elle est bien moins élégante que le DLSS de NVIDIA, mais a l'avantage d'être plus ouverte. On peut d'ailleurs la détourner à notre intérêt.
Cela fait maintenant trois ans que NVIDIA a mis sur le marché ses GeForce RTX de série 20 (Turing), premières à intégrer des RT et Tensor Cores au sein de l'offre grand public, ouvrant la voie au ray tracing et au Deep Learning Super Sampling (DLSS). Une solution qui vise à effectuer un rendu dans les jeux dans une définition plus basse que celle demandée, puis à l'agrandir en cherchant à limiter au maximum la perte de qualité.
DLSS : une petite révolution pour les jeux vidéo
La société a opté pour une approche peu conventionnelle pour l'époque : utiliser un modèle issu de l'entrainement d'un réseau de neurones. Son but est ainsi de remplir le vide issu de l'agrandissement en recréant tous les détails manquants. Un travail de « retouche photo » pour lequel les IA sont de plus en plus utilisées, mais devant cette fois être réalisé à très grande vitesse, puisque cela doit réduire le temps de rendu (16,7 ms pour 60 ips), pas l'augmenter.
Assez peu efficace dans sa première version, DLSS était bien plus convaincant dans sa seconde itération que l'on trouve désormais dans un nombre croissant de jeux, avec une intégration native à des moteurs comme Unity ou l'Unreal Engine. Il fallait donc qu'AMD réagisse. Depuis 2018, la société promettait régulièrement de proposer une solution équivalente. Nommée Fidelity FX Super Resolution (FSR), elle est désormais exploitable.
FSR : ce n'est pas DLSS, mais ça peut être utile
Il s'agit d'une solution open source, qui n'utilise pas du tout l'intelligence artificielle (les CPU et GPU grand public d'AMD ne proposant aucun accélérateur pour ces usages). Mais plutôt un algorithme d'augmentation de la définition à l'ancienne, présenté comme plus efficace que les solutions actuelles, accompagné d'un filtre de netteté.
Une solution moins convaincante, donc, que celle de NVIDIA, mais bien plus ouverte. Au point que l'on peut l'utiliser pour augmenter la définition de n'importe quelle image, que ce soit avec un GPU AMD, NVIDIA ou même une machine équipée d'un vieux processeur Intel. On vous explique comment faire.
Commençons cet article par un aveu. Il est né de notre volonté de publier un dossier sur l'amélioration des images, notamment de leur définition. De nombreuses solutions sont désormais disponibles sur le marché, certaines profitant d'accélération matérielle. Il était donc temps de faire le point sur le sujet et sur ce que chacune apporte.
Au gré de nos recherches, nous avons découvert qu'il était possible d'utiliser FSR de manière simple pour augmenter la définition et la netteté d'une image, sans nécessiter d'application payante ou de matériel spécifique. Nous avons donc décidé d'ouvrir notre dossier par cette possibilité.
Elle sera également l'occasion d'évoquer comment nous avons développé une interface graphique (GUI) pour exploiter FSR pour l'amélioration d'image encore plus simplement sous Windows. C'était un peu notre « summer project » à nous, qui nous a occupé une partie de ces dernières semaines.
FSR, simple comme un Compute Shader
Commençons par répondre à une question : qu'est-ce que le Fidelity FX Super Resolution en réalité ? Comme le précise sa documentation technique, il s'agit d'une solution pensée pour être intégrée simplement, sans dépendance particulière, via un Compute Shader, un petit programme appliqué pendant le rendu graphique.
C'est ce qui explique que l'on voit déjà naître plusieurs projets pour intégrer FSR même à des jeux qui n'en profitent pas nativement. Le nombre de titres supportés devrait néanmoins rapidement s'étendre puisque, comme pour DLSS, une intégration à Unity 2021.2 HDRP ou l'Unreal Engine via un patch sont disponibles.
Il faut d'ailleurs savoir que Timothy Paul Lottes, qui travaille au sein de l'Unity Graphics Innovation Group, était auparavant chez AMD où il a créé la version 1.0 de FSR. Il est aussi connu pour son travail sur le FXAA et le TXAA chez NVIDIA il y a une dizaine d'années (entre autres). Il vient d'ailleurs de publier avec Kleber Garcia (également chez Unity, ex-EA) une présentation technique sur l'implémentation de FSR à l'occasion du SIGGRAPH 2021.
Outre sa simplicité d'implémentation, FSR se veut aussi très largement compatible, adapté aux consoles disposant d'un SoC AMD comme les Xbox et PlayStation, de la dernière génération ou de la précédente. En réalité, nous avons pu l'utiliser sur un vieux processeur Intel Core de 6e génération (mais avec de moins bonnes performances).
Il peut être exécuté avec des calculs en double précision (FP32) ou simple précision (FP16), le premier étant recommandé pour les architectures antérieures à Vega chez AMD, qui ne supportent pas très bien le groupement de calculs en FP16 et ont alors de moins bonnes performances.
Ainsi, une image doit pouvoir être calculée en 1440p entre 0,2 et 0,5 ms sur une carte graphique plus ou moins puissante, le double pour de la 4K. AMD définit plusieurs niveaux de qualité, selon le facteur d'augmentation de la définition qui va de 1,3x par côté (Ultra Quality) à 2x par côté (Performance). Comme nous le verrons plus loin, ces modes n'existent en réalité pas dans FSR, qui nécessite une image en entrée et une définition de sortie.
FSR = EASU + RCAS
Comme nous l'avons évoqué précédemment, FSR est une solution en deux passes. La première consiste à augmenter la définition de l'image via l'algorithme EASU : Edge Adaptative Spatial Upsampling. Un nom complexe qui consiste à dire, en très simplifié, que l'on va agrandir l'image dans son ensemble (spatial), de manière variable au sein de celle-ci (adaptive), avec une analyse au niveau des points saillants (edge).
L'idée est de proposer une solution qui offre un meilleur résultat que la montée en définition basique proposée par les écrans, tout en gardant un impact assez faible sur les performances. Elle utilise donc un filtre de Lanczos, courant dans la reconstruction d'image mais gourmand en puissance de calcul, notamment parce qu'il utilise le sinus cardinal (sinc). EASU introduit donc une approximation polynomiale pour en améliorer les performances.
AMD précise que FSR n'est pas pensé pour remplacer un dispositif d'Anti-Aliasing (AA), contrairement à DLSS, ajoutant qu'il est préférable qu'une telle passe ait été effectuée avant d'appliquer EASU. Cela vient notamment du fait que celui-ci va ajouter une dose de flou, il serait contre-productif d'effectuer l'AA ensuite.
C'est pour contre-balancer l'ajout de ce « flou » que la seconde passe de FSR est nécessaire : RCAS (Robust Contrast Adaptative Sharpening). Une version améliorée du CAS précédemment proposé par AMD (et conçu par Timothy Lottes), qui est grosso modo un filtre d'amélioration de la netteté de l'image.
La société prévient d'ailleurs les développeurs : ils ne doivent pas proposer EASU et RCAS séparémment. Dans leur interface, ils doivent bien ne proposer qu'une fonctionnalité FSR activant automatiquement l'anti-aliasing :
Utilisez FSR sur n'importe quelle image
À la mise en ligne du code source de FSR, AMD a également publié un nouvel outil : FidelityFX CLI. Ce dernier intègre les shaders de CAS, RCAS et EASU, permettant de les appliquer à n'importe quelle image ou photo. On peut ainsi effectuer des essais avec ces différentes solutions. Les formats BMP, PNG, ICO, JPG, TIF et GIF sont gérés.
Transformons par exemple une image nommée 1080p.jpg en 4K. jpg :
FidelityFX_CLI.exe -Mode EASU -Scale 3840 2160 1080p.jpg 4K.jpg
Le mode FP16 (format de textures R16G16B16A16_FLOAT) n'est pas appliqué par défaut (format de textures R8G8B8A8_UNORM). Vous pouvez l'activer si vous le désirez en ajoutant un paramètre :
FidelityFX_CLI.exe -Mode EASU -Scale 3840 2160 -FP16 1080p.jpg 4K.jpg
Autre possibilité, utiliser l'espace de couleurs linéaire plutôt que sRGB, là aussi à n'activer que si nécessaire. Notez que cela ne fonctionnera que si le paramètre FP16 n'est pas utilisé :
FidelityFX_CLI.exe -Mode EASU -Scale 3840 2160 -Linear 1080p.jpg 4K.jpg
La passe RCAS a un fonctionnement peu classique, puisqu'il faut indiquer une valeur pour ce filtre de netteté. Mais 0.0 est la valeur maximale, puisqu'elle désigne un niveau de réduction. Plus il sera élevé moins le filtre sera appliqué. AMD recommande une valeur de 0.2 et précise qu'à partir de 2.0, la différence n'est plus perceptible :
FidelityFX_CLI.exe -Mode RCAS -Sharpness 0.0 4K.jpg 4K_RCAS.jpg // Image avec le plus grand niveau de netteté
FidelityFX_CLI.exe -Mode RCAS -Sharpness 0.5 4K.jpg 4K_RCAS.jpg // Image avec un niveau de netteté réduit
À titre de comparaison, vous pouvez augmenter la définition de l'image via des méthodes natives à Windows :
FidelityFX_CLI.exe -Mode NearestNeighbor -Scale 3840 2160 1080p.jpg 4K_NN.jpg
FidelityFX_CLI.exe -Mode Linear -Scale 3840 2160 1080p.jpg 4K_Linear.jpg
FidelityFX_CLI.exe -Mode Cubic -Scale 3840 2160 1080p.jpg 4K_Cubic.jpg
FidelityFX_CLI.exe -Mode HighQualityCubic -Scale 3840 2160 1080p.jpg 4K_HQC.jpg
FidelityFX_CLI.exe -Mode Fant -Scale 3840 2160 1080p.jpg 4K_Fant.jpg
Vous pouvez aussi opter pour la solution précédente d'AMD avec le filtre de netteté CAS en une seule passe. Attention, cette fois le niveau de netteté doit être indiqué entre 0.0 (le plus faible, par défaut) et 1.0 (le plus fort) :
FidelityFX_CLI.exe -Mode CAS -Scale 3840 2160 -Sharpness 1.0 1080p.jpg 4K_CAS.jpg // Image avec le plus grand niveau de netteté
FidelityFX_CLI.exe -Mode CAS -Scale 3840 2160 -Sharpness 0.5 1080p.jpg 4K_CAS.jpg // Image avec un niveau de netteté réduit
Amélioration d'une photo : comment s'en tire FSR ?
Et dans la pratique, quel résultat obtient-on ? Pour le savoir, nous avons utilisé une des images de référence de Gigapixel AI qui représente un perroquet, d'une définition de 640 x 411 pixels. Nous l'avons doublée, via GIMP en utilisant les paramètres par défaut de l'outil, puis avec le mode EASU de FSR :
Image originale - x2 via GIMP (à gauche) - x2 via EASU (à droite)
Ici, on voit clairement que l'image de droite (EASU) est plus nette que celle de gauche, même avant l'application de RCAS pour ajouter de la netteté. Effectuons maintenant cette seconde passe avec RCAS (0.2) et comparons avec CAS (0.8) :
EASU + RCAS 0.2 (à gauche) - CAS 0.8 (à droite)
Cette fois encore on voit bien le gain de netteté apporté par RCAS en complément d'EASU (à gauche), avec une meilleure fidélité à l'originale que CAS (à droite). Avec ce dernier, les ombres sous le plumage sont en effet trop nettement accentuées. Dans les deux cas, on note que cette passe de netteté ajoute du bruit à l'image.
Autre point à noter : la taille des fichiers, qui varie beaucoup selon les cas :
- Original (640x822 px) : 47 ko
- Upscaling GIMP : 156 ko
- EASU : 121 ko
- EASU + RCAS : 137 ko
- CAS : 139 ko