Je m'attendais à ce que ça marche du 1er coup

- Mortal, en train de bricoler la console de mixage

Dojobar
L'émission de radio déjantée qui revient toutes les deux semaines !

Émission s21e09 − Chrono Trigger
Le 26 juin 2023, par Mortal



Émission s21e06 – Pot-pourri
Le 13 mai 2023, par Mortal




La Parenthèse Technique − Mise à l’échelle par nombre entier

À l’origine, je comptais parler directement du XRGB-Mini Framemeister. Mais au fur et à mesure de la rédaction, je me suis rendu compte de l’importance fondamentale de comprendre comment fonctionne l’upscaling (mise à l’échelle) notamment pour les contenus faible définition (typiquement du 240p ou du 288p que produisait nos bonnes vieilles consoles).

Histoire de ne pas faire un pavé imbuvable, l’article d’origine a donc été découpé en petits morceaux pour pouvoir apprécier au mieux les subtilités de configuration d’un upscaler et surtout comprendre pourquoi, dans certains cas, le fait de toucher un tout petit peu à un paramètre de zoom, rend l’image totalement dégueulasse.

Avant de commencer, il y a deux ou trois petites choses à savoir :

  • Les écrans modernes sont des écrans à résolution de pixels fixe : vous pouvez envoyer ce que vous voulez comme taille d’image dessus, ils vont forcément la retraduire dans leur résolution native. Et généralement, ils font ça très mal à quelques exceptions près.
  • Les écrans CRT n’ont pas de résolution fixe : vous pouvez balancer un signal 1080p sur une télé des années 60, ça affichera quelque chose (illisible certes, mais ça fonctionnera). Les écrans CRT ont un nombre fixe de lignes de balayage sur l’écran.
  • Toutes les consoles traitant du signal analogique (chez Nintendo, toutes jusqu’à la WiiU) fonctionne différemment : les résolutions internes utilisées sont différentes et le signal envoyé va être différent pour chaque.

Il est donc impossible d’afficher véritablement des « pixels » sur un vieil écran. Il dessine simplement des lignes. Et il se trouve que certaines consoles (NES et Super NES en tête) se servaient de cette particularité pour leur rendu. Vous avez pu voir que la NES Mini propose un mode « square pixel » (pixel carré) qui correspond en fait à la résolution interne de la machine en 8/7 et non en 4/3. Si cela fait des jolis pixels bien carrés que nos télévisions modernes n’auront aucun mal à afficher, cela ne correspond pas au rendu réel sur une télé CRT qui a tendance à étirer l’image sur toute la résolution horizontale, du fait qu’elle n’affiche finalement que des lignes.

Maintenant, vient se poser le problème des scanlines. Comment obtenir de belles scanlines sur un écran à résolution de pixels fixe à partir d’un signal analogique qui n’est pas fait pour ça ? Sur une télé CRT pas de problème : le balayage des lignes n’éclaire qu’en ligne sur 2, donc on a forcément de belles lignes bien noires dessinées sur l’écran quand on balance un signal Low-Res.

Sur écran LCD/Plasma/OLED, c’est une autre paire de manches : les lignes noires doivent être dessinées par l’upscaler sur l’image d’origine, qui sera ensuite affichée… et probablement déformée par la mise à l’échelle nécessaire ! Voici un exemple ce qui peut arriver :

scanlines_bad_upscale

Le résultat est bien pire que si on avait choisi de ne pas dessiner les scanlines tout court ! Et ce pour une raison très simple : les scanlines ne sont pas parfaitement alignées avec la « grille » (de pixels) que représente une télé moderne. L’upscaler (externe ou celui de la télé) essaie donc de compenser et va dessiner des lignes noires plus larges ou moins larges d’un pixel (ou deux ou trois) à certains endroits.

Le seul moyen pour se prémunir de ces désagréments est de s’arranger pour aligner soi-même les lignes noires avec les pixels des moniteurs à résolution de pixels fixe : on va essayer de multiplier systématiquement la résolution d’origine par un nombre entier.

Mise à l’échelle par nombre entier

Il va donc falloir avoir des taux d’upscale qui s’expriment en nombre entier de la résolution d’origine d’où le x1, x2, x3, x4, x5 Scaling : on multiplie par 1, 2, 3, 4 ou 5 l’image d’origine.

Il est alors très facile de dessiner des scanlines : il suffit de dessiner des lignes noires une ligne sur deux ou deux lignes sur quatre ou trois lignes sur six, etc… en fonction de la multiplication d’origine.

Illustrons avec cette image de Super Mario 64 version NTSC, résolution d’origine 320×240 :

super_mario_64_x1

Si je l’applique bêtement sur un écran Full HD (1920×1080 donc), ça donne un upscale 1x sans possibilité de faire des scanlines (et ça a l’air un peu con parce que ça fait une image toute petite) :

super_mario_64_x1

En x2, on multiplie les lignes verticales et horizontales par 2. Chaque pixel d’origine va donc être transformé en 4 pixels sur l’image. C’est toujours un nombre entier donc l’écran ne devrait pas se prendre les pieds dans le tapis. Et c’est à partir de là qu’on peut faire des jolies scanlines en intercalant des lignes noires au lieu de bêtement multiplier. Pour notre illustration, on sort donc une image en 640×480. Ça n’occupe toujours pas tout l’écran :

super_mario_64_x2

Même principe pour le x3. On obtient alors une image en 1280×720 :

super_mario_64_x3

Mais, le plus intéressant, c’est le x4 et le x5. Si l’on multiplie l’image d’origine par 4, elle ne rentre pas tout à fait dans du FullHD (ce n’est pas un multiple), on obtient du 960p et il y a donc des bandes noires en haut et en bas de l’écran.

super_mario_64_x4

C’est la meilleure/plus grande image qu’on peut obtenir sur un moniteur Full HD. Sans commencer à jouer avec l’overscan… en passant en x5 ! L’image ne tient alors plus complètement sur l’écran, une partie est effacée (en dehors des bords de l’image). Néanmoins, c’était aussi le cas nativement sur les téléviseurs CRT. La plupart des jeux tournant en Lo-Res (240p) ont été prévu pour que les bords soient un peu « mangés » par l’écran.

super_mario_64_x5

Ici, Super Mario 64 fait 1600×1200 donc 60 pixels sont perdus en haut et en bas de l’écran. C’est l’équivalent (divisé par 5) de 12 pixels (ou 12 lignes) en haut et en bas par rapport à la résolution native. Et vous remarquerez que vous pouvez toujours tout lire sur l’écran (Start, Super Mario 64 en fond, etc…). Ce n’est donc pas forcément déconnant de passer en x5 dans certains cas.

Ça, ça marche très bien pour des résolutions NTSC (240p). Dès que l’on passe en PAL, c’est beaucoup plus compliqué : la résolution native étant alors à 288 lignes de haut, on ne peut obtenir de scanlines correctement qu’en faisant du x2 (et donc en perdant une bonne partie de l’écran) ou en réglant son upscaler sur 576p50 (résolution supportée par tous les moniteurs Full HD).

Le principe général est donc le suivant : si vous n’en avez rien à foutre des scanlines, essayez systématiquement de transmettre à votre moniteur sa résolution native en faisant juste attention au rafraîchissement (1080p50 pour une source 50Hz, 1080p60 pour du 60Hz) et laissez-le faire son boulot. C’est le meilleur moyen (et souvent le seul) pour obtenir un résultat correct sur un écran LCD.

Si vous voulez les scanlines, il va falloir faire quelques sacrifices : soit vous devrez faire de l’overscan et couper une partie de l’écran, soit vous devrez faire avec une résolution qui ne remplit pas tout l’écran.

À noter que les écrans 4K vont encore apporter un facteur supplémentaire : leur résolution native en 2160p est un multiple parfait pour les sources 1080p (x2), 720p (x3), 240p (x9), mais pas 480p. Quant aux résolutions PAL, elles vont, comme d’habitude, nous faire chier :

  • 288p × 7,5 = 2160p
  • 576p × 3,75 = 2160p

Pour la mise à l’échelle en nombre entier, on a pas fini de rigoler…

Bref, j’espère que ça vous aura aider à comprendre pourquoi il est très important de multiplier systématiquement les résolutions par des nombres entiers si l’on veut obtenir une qualité d’image optimum.

La prochaine fois, je vous jure, je m’atèle au Framemeister.


Par Mortal
Le 17 novembre 2016 | Catégories : Editos

Je le couperai au montage…
Voir les articles de Mortal

A voir également
Les trucs qu'on a rédigés avec nos petits doigts potelés

Dojo Hebdo 608 : du 18 au 24 novembre 2024
Le 24 novembre 2024, par Gueseuch

The Stanley Parable Ultra Deluxe (NS)
Le 22 novembre 2024, par Mortal

Dojo Hebdo 607 : du 11 au 17 novembre 2024
Le 17 novembre 2024, par Gueseuch

Dojo Hebdo 606 : du 4 au 10 novembre 2024
Le 10 novembre 2024, par Gueseuch


Dojo Hebdo 604 : du 21 au 27 octobre 2024
Le 27 octobre 2024, par Gueseuch

Dojo Hebdo 603 : du 14 au 20 octobre 2024
Le 20 octobre 2024, par Gueseuch

Dojo Hebdo 602 : du 7 au 13 octobre 2024
Le 13 octobre 2024, par Gueseuch




Dojobar
L'émission de radio déjantée qui revient toutes les deux semaines !

Émission s21e09 − Chrono Trigger
Le 26 juin 2023, par Mortal



Émission s21e06 – Pot-pourri
Le 13 mai 2023, par Mortal