Gros plan macro sur la dalle d'une console portable rétro, montrant la trame de pixels

Un jeu Super Nintendo affiché tel quel sur une console portable moderne a quelque chose de bizarre. Les pixels sont des carrés parfaits, les contours sont durs, les dégradés du ciel se cassent en bandes visibles. Ce n'est pas un défaut de l'émulateur : c'est l'image exacte que la console produisait. Le décor a changé. Ces jeux ont été dessinés devant un téléviseur cathodique qui étalait le faisceau, mélangeait les couleurs voisines et laissait une ligne sombre sur deux. Les shaders servent à rendre une partie de ce traitement. Ils ont un coût, largement sous-estimé sur une petite machine.

Ce que le cathodique faisait, et que votre dalle ne fait pas

Un téléviseur à tube ne dessine pas des pixels. Un faisceau balaie l'écran ligne par ligne et allume des phosphores dont la luminosité retombe aussitôt. Rien n'a de bord franc : un point clair déborde sur ses voisins, une ligne sur deux reste sombre en 240p, et la trame de phosphores découpe chaque zone colorée en cellules rouges, vertes et bleues.

Le signal ajoutait sa part. En composite ou en RF, couleur et luminosité voyagent mélangées et se contaminent. Les studios s'en servaient : les damiers d'un pixel sur deux, très visibles aujourd'hui, se fondaient en dégradé continu. Une cascade de Mega Drive en damier bleu et blanc devenait un aplat translucide. C'est une intention d'auteur, pas un accident. Une dalle LCD ou OLED fait l'inverse : chaque pixel est un rectangle allumé de façon uniforme, sans rémanence ni débordement. L'image n'a jamais été aussi fidèle aux données de la console, et c'est pour cela qu'elle paraît fausse.

Un shader, en une phrase

Un shader est un petit programme exécuté par la puce graphique sur l'image calculée par l'émulateur, juste avant l'affichage. Il travaille pixel de sortie par pixel de sortie : il assombrit, mélange, ajoute une trame. L'émulation n'est pas touchée, et vous pouvez en changer en cours de partie sans rien casser.

On ne charge presque jamais un shader seul, mais un preset : une chaîne de passes enregistrée dans un fichier. La documentation Libretro liste trois formats : le Cg (.cgp), obsolète ; le GLSL (.glslp), côté OpenGL, celui des petites machines ARM ; et le slang (.slangp), recommandé mais qui demande un pilote Vulkan ou GL core. Un preset slang refuse de se charger sur un pilote qui ne le gère pas, d'où la plupart des « rien ne se passe ». À vérifier selon votre firmware. Retenez surtout que le nombre de passes fait le coût.

Les grandes familles

La mise à l'échelle entière

Ce n'est pas un shader, c'est le préalable à tous les autres. Multiplier l'image par un nombre entier donne à chaque pixel d'origine le même nombre de pixels de sortie. Avec un facteur non entier, certains pixels occupent deux lignes et d'autres une seule : les sprites deviennent irréguliers et le moindre shader de trame produit un moirage.

Les lignes de balayage

Le shader assombrit une ligne de sortie sur deux, parfois avec un profil de faisceau qui s'élargit dans les zones claires. C'est la famille la plus utile sur les jeux 240p, de la NES à la PlayStation 1, et sur l'arcade. Elle n'a aucun sens sur les jeux de portables d'époque, qui n'ont jamais eu de lignes de balayage.

Le masque

Le masque recrée la trame des phosphores : grille d'ouverture verticale façon Trinitron, ou masque à fentes plus doux. Il redonne du grain, mais coûte de la luminosité et exige de la place : crt-easymode, signé EasyMode, annonce dans son en-tête viser 1080p ou mieux. En dessous, le masque ne tombe plus juste sur les pixels de la dalle et vire au liseré coloré.

La courbure et la géométrie

Bomber l'image et arrondir les angles : la partie la plus spectaculaire, et la plus chère. Le shader crt-geom, de cgwg, Themaister et DOLLS, combine courbure, lignes de balayage, masque et coins arrondis. L'auteur de crt-pi, davej, note dans son code que la courbure ralentit beaucoup les choses. Sur une portable, c'est le premier réglage à couper.

Le signal composite

Les filtres NTSC simulent la chaîne RF, composite ou S-Video, et refondent les damiers en dégradés. Ils transforment l'image bien plus que des scanlines, et ne conviennent qu'aux systèmes qui passaient par ce signal : NES, Mega Drive, Super Nintendo.

Les écrans à cristaux liquides

La famille handheld fait l'inverse des shaders cathodiques : elle recrée une dalle de portable d'époque, sa grille entre les pixels, ses sous-pixels, parfois la rémanence de la Game Boy d'origine. C'est le bon choix pour Game Boy, Game Boy Advance ou Neo Geo Pocket.

Le lissage pixel-art

HQx, xBR, xBRZ, SABR ou ScaleFX reconstruisent des contours lisses à partir des pixels d'origine. Le rendu divise : sprites nettoyés pour les uns, plastique fondu pour les autres. Ce sont des analyses de voisinage, donc plus lourdes qu'un assombrissement de ligne.

Famille Ce que ça fait Quand ça se justifie Coût
Mise à l'échelle entière Un pixel d'origine = un bloc régulier Toujours, avant tout le reste Nul
Filtre bilinéaire Adoucit un agrandissement non entier Dépannage Nul
Lignes de balayage Assombrit une ligne sur deux Jeux 240p, arcade Faible
Masque Recrée la trame des phosphores Écrans très définis, TV Faible à moyen
Courbure, géométrie Bombe l'image, arrondit les coins TV, machines puissantes Élevé
Filtre NTSC Refond les damiers, mélange les couleurs NES, Mega Drive, SNES Moyen à élevé
Cristaux liquides Grille, sous-pixels, rémanence Game Boy, GBA, Neo Geo Pocket Faible à moyen
Lissage pixel-art Reconstruit des contours nets Sprites 2D, affaire de goût Moyen à élevé

Le coût en performance, le point qu'on oublie

Pour tenir 60 images par seconde, la console dispose d'environ 16,7 millisecondes par image. L'émulation en consomme déjà une partie ; le shader prend ce qui reste, sur la puce graphique, composant faible de la plupart des portables rétro. Quand le budget est dépassé, vous n'observez pas forcément un compteur chuter : vous entendez d'abord le son craquer, puis la console tiédit et l'autonomie fond.

Deux repères donnent l'échelle. Le shader zfast_crt, de Greg Hogan, se présente comme un shader CRT simple et rapide et annonce tourner à 60 images par seconde sur un Raspberry Pi 3 en 1920×1080. À l'opposé, crt-royale forme à lui seul une catégorie du dépôt Libretro tant sa chaîne de passes est longue, et le Mega Bezel empile simulation de tube, cadre et reflets.

  • Gratuit : échelle entière et filtre bilinéaire, assurés par la puce sans code ajouté.
  • Léger : les shaders écrits pour le matériel modeste, zfast_crt et crt-pi en tête.
  • Moyen : crt-easymode ou crt-geom sans courbure, les shaders cristaux liquides.
  • Lourd : la courbure, les filtres NTSC complets, ScaleFX, NNEDI3, crt-royale, le Mega Bezel.

La deuxième règle est plus dure à accepter : un shader se paie d'abord sur les systèmes qui vont déjà à la limite. Sur une Linux à puce Allwinner H700 ou SigmaStar, la Super Nintendo a de la marge, la PlayStation 1 beaucoup moins, la Dreamcast pas du tout. Nos recommandations d'émulateurs PlayStation 1 valent pour une machine sans shader ; ajoutez une trame et le même jeu peut bégayer.

Machine Ce qui passe raisonnablement
Linux d'entrée de gamme, jeux 8 et 16 bits Échelle entière, scanlines légères, cristaux liquides
Linux, jeux PS1, N64 ou Dreamcast Échelle entière seule
Android milieu de gamme, jeux 2D et PS1 crt-easymode ou équivalent, sans courbure
Android haut de gamme et Windows Presets complets, masque compris
Console branchée sur un téléviseur Presets lourds, courbure et cadre

Pourquoi la même trame ne rend pas pareil selon l'écran

Une ligne de balayage a besoin d'au moins deux lignes de sortie par ligne d'origine : une éclairée, une sombre. Pour un jeu en 240 lignes, il faut donc 480 lignes à l'écran au strict minimum, et le résultat reste grossier. Un masque en demande davantage, puisqu'il découpe chaque pixel en trois cellules colorées. C'est ce que dit l'en-tête de crt-easymode en visant 1080p, et la documentation d'émulation rappelle qu'en dessous d'une définition confortable, ces shaders ne fonctionnent pas correctement.

Sur une petite dalle 4:3 peu définie, les lignes sombres occupent une part énorme de l'image et l'assombrissent franchement, alors que la luminosité de ces écrans n'est déjà pas leur point fort. Et comme les pixels sont minuscules, la trame se voit à peine à distance de jeu : vous perdez de la lumière sans gagner l'effet recherché.

Tout change dès qu'on monte en définition. La TrimUI Brick affiche 1024×768 sur 3,2 pouces : un jeu en 240 lignes y tient trois fois, soit 720 lignes utiles, assez pour une trame propre. Sur un écran Android de 5,5 pouces bien défini, ou sur un téléviseur en HDMI, les presets lourds retrouvent leur sens. Notre comparaison Android ou Linux détaille ce que chacun encaisse.

Jugez un shader à distance de jeu, pas le nez sur l'écran : un rendu superbe à 15 cm devient souvent invisible à 40 cm.

Comment les activer, quel que soit le système

Partout où RetroArch est présent, le chemin est stable : menu rapide en cours de jeu, section des shaders, chargement d'un preset, puis enregistrement pour le cœur ou pour le jeu. Enregistrer pour le cœur applique la trame à tous les jeux du système : c'est presque toujours ce qu'il faut. Le reste des réglages est traité dans notre guide des réglages essentiels de RetroArch.

Les firmwares personnalisés ajoutent parfois leur liste de filtres dans les options d'affichage, indépendante de RetroArch : pratique, sans risque, mais moins fin. Notre guide d'installation des firmwares personnalisés indique où ces menus se trouvent. Sur Android, les émulateurs autonomes ignorent les presets RetroArch et proposent chacun leur liste, plus courte.

Un shader ne change rien à la provenance de vos jeux : le point de départ reste vos propres supports ou les offres légales recensées sur la page Où jouer légalement.

Trois réglages qui marchent

Le minimaliste

Mise à l'échelle entière, filtre en plus proche voisin, aucun shader. C'est le réglage le plus net, le plus lumineux, et le seul qui ne coûte rien. Sur une Linux d'entrée de gamme, sur un petit écran, ou dès que le système émulé est exigeant, c'est aussi le plus raisonnable. Beaucoup de joueurs y reviennent.

L'équilibré

Mise à l'échelle entière, plus un shader de lignes de balayage léger, zfast_crt ou crt-pi avec la courbure désactivée. Vous récupérez le grain sans perdre d'images par seconde, et la baisse de luminosité reste supportable en montant l'écran d'un cran. C'est le compromis que nous conseillons le plus souvent.

Le nostalgique

Preset cathodique complet : lignes de balayage, masque, courbure, éventuellement filtre composite. Réservez-le à une Android haut de gamme, à une machine Windows, ou à une portable branchée sur un téléviseur. Vérifiez-le sur dix minutes de jeu réel, pas sur un écran-titre : c'est en mouvement que les chutes se voient. Gardez un preset léger en second.

Aucun de ces trois réglages ne vaut dans l'absolu : tout dépend de la machine. Notre comparateur permet de situer la vôtre, et nos modèles sont rangés dans la collection consoles rétro portables.

Un shader peut-il abîmer ma console ?

Non. C'est un traitement d'affichage : il ne modifie ni le firmware ni les fichiers de jeu et se désactive en deux manipulations. Le seul effet réel est une puce graphique plus sollicitée : une console qui chauffe davantage et une autonomie plus courte.

Pourquoi mon preset ne se charge pas du tout ?

Le plus souvent, une question de format. Les presets slang (.slangp) demandent un pilote Vulkan ou GL core, absent de la plupart des petites machines Linux ; il leur faut des presets GLSL (.glslp). Vérifiez aussi que le paquet de shaders a été téléchargé : il n'est pas toujours présent d'origine.

Faut-il un shader pour les jeux Game Boy Advance ?

Pas un shader cathodique, en tout cas : la GBA n'a jamais eu de lignes de balayage. Pour retrouver son rendu, allez vers la famille des shaders cristaux liquides, grille de pixels et rémanence comprises. Beaucoup de joueurs préfèrent malgré tout l'image brute, plus lumineuse.

Le shader rend mon écran trop sombre, que faire ?

C'est mécanique : assombrir une ligne sur deux enlève de la lumière, et un masque en enlève encore. Baissez l'intensité des lignes dans les paramètres du shader, puis montez la luminosité de la dalle. Si l'image reste terne, votre écran est trop peu lumineux pour cette famille.

Peut-on utiliser un shader différent selon le système émulé ?

Oui, et c'est la bonne pratique. Dans RetroArch, on enregistre le preset pour le cœur : trame cathodique sur les cœurs Super Nintendo ou Mega Drive, shader cristaux liquides sur les cœurs Game Boy, rien sur les systèmes lourds. Un preset peut aussi être enregistré pour un seul jeu.

Est-ce que ça vaut le coup sur un écran de 3,5 pouces ?

Modérément. À cette taille, une trame fine se voit peu à distance de jeu tout en coûtant de la luminosité. Un shader de scanlines léger reste agréable sur les jeux 8 et 16 bits ; un masque n'a pas assez de pixels pour s'exprimer.

ÉcranRéglagesRetroarchRubrique-techniqueScanlinesShaders

Kommentar hinterlassen