Rendu des couleurs correct des rétroconsoles dans les émulateurs



Presque toutes les rétro-consoles de jeux génèrent des couleurs dans certaines des options de codage RVB.

Mais ces couleurs de pixels sont souvent conçues pour des écrans complètement différents de ceux sur lesquels les émulateurs fonctionnent habituellement. Dans cet article, je parlerai de l'importance de l'émulation des couleurs, je donnerai quelques exemples de code et des captures d'écran.

Les écrans les plus courants sont les écrans LCD. Ils sont connus pour avoir des niveaux de noir très pauvres. Les différences entre TN, PVA et IPS n'affectent pas trop cela.

Certains fans jouent sur des moniteurs CRT, et les écrans OLED gagnent en popularité, en particulier sur les téléphones et les tablettes. Mais dans cet article, nous considérerons principalement les écrans LCD, bien que cette technique soit importante pour les écrans de tout type.

Précision des couleurs


Premier détail important: la plupart des ordinateurs fonctionnent en mode couleur 24 bits, fournissant des détails de couleur 8 bits pour les canaux rouge, vert et bleu. Mais dans la plupart des anciens systèmes de jeux, les couleurs ne sont pas définies avec une telle précision.

Par exemple, Sega Genesis code les couleurs 9 bits, ce qui donne 3 bits par canal.

La solution la plus naïve serait de mettre 3 bits dans les 3 bits les plus élevés de la sortie et de laisser les 5 bits inférieurs vides, mais la couleur blanche devient un peu grise.

Un exemple:

  000 000 000 -> 000'00000 000'00000 000'00000
 111 111 111 -> 111'00000 111'00000 111'00000 



Si vous les remplissez d'unités, le noir devient trop clair.

Un exemple:

  000 000 000 -> 000'11111 000'11111 000'11111
 111 111 111 -> 111'11111 111'11111 111'11111 



La solution consiste à répéter les bits d'origine afin qu'ils remplissent tous les bits de sortie.

Un exemple:

  000 -> 000 000 00 ...
 010 -> 010 010 01 ...
 011 -> 011 011 01 ...
 111 -> 111 111 11 ... 

Sous forme de code:

  uint8 rouge = r << 5 |  r << 2 |  r >> 1
 // rrr00000 |  000rrr00 |  000000rr -> rrrrrrrrr 

Émulation d'écran


Les systèmes de jeu rétro n'ont pas été conçus pour fonctionner sur les écrans d'ordinateur LCD modernes. En règle générale, les consoles domestiques étaient conçues pour les écrans CRT, et les consoles portables utilisaient des panneaux LCD beaucoup plus anciens et moins précis.

Dans cet article, nous ne considérerons pas les artefacts d'écran, tels que la courbure de l'écran, les lignes de balayage, l'aberration chromatique, le mélange inter-images, les grilles d'ouverture, etc.: pour l'instant, nous nous concentrerons uniquement sur les couleurs des pixels individuels.

Moniteurs PC


Les moniteurs ont une gamme de couleurs assez large, car seuls certains d'entre eux sont calibrés professionnellement selon des normes comme SRGB, mais en général, le mieux que nous puissions faire est d'essayer d'émuler les couleurs comme si nous utilisions un moniteur SRGB correctement calibré.

Émulation CRT: Super Nintendo


La principale différence entre les écrans CRT et les moniteurs LCD des ordinateurs est la réduction significative des niveaux de noir, qui ne peut être que légèrement compensée par la courbe de correction gamma:

  // Les couleurs SNES sont au format RGB555, il y a donc 32 niveaux pour chaque canal
 const statique uint8 gammaRamp [32] = {
   0x00,0x01,0x03,0x06,0x0a 0x0f 0x15,0x1c
   0x24, 0x2d, 0x37, 0x42, 0x4e, 0x5b, 0x69, 0x78,
   0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0
   0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff
 }; 

Ce tableau est emprunté à Overload of Super Sleuth / Kindred. Il masque la moitié inférieure de la palette de couleurs, laissant la partie supérieure inchangée.

Cela a un effet étonnant sur l'image lors de l'émulation: l'original est affiché à gauche, l'image avec correction gamma appliquée à droite:





Émulation LCD: Game Boy Advance


Game Boy Advance avait l'un des pires écrans LCD avec des couleurs complètement fanées. Les développeurs rusés ont réalisé qu'en exagérant considérablement les couleurs, on peut obtenir des résultats plus agréables sur un équipement réel.

Bien sûr, si vous utilisez ces couleurs sur un moniteur LCD standard, le résultat sera un cauchemar coloré. Heureusement, nous pouvons compenser cela en créant des couleurs assez naturelles:

  double lcdGamma = 4,0, outGamma = 2,2;
 double lb = pow (B / 31,0, lcdGamma);
 double lg = pow (G / 31,0, lcdGamma);
 double lr = pow (R / 31,0, lcdGamma);
 r = pow ((0 * lb + 50 * log + 255 * lr) / 255, 1 / outGamma) * (0xffff * 255/280);
 g = pow ((30 * lb + 230 * lg + 10 * lr) / 255, 1 / outGamma) * (0xffff * 255/280);
 b = pow ((220 * lb + 10 * log + 50 * lr) / 255, 1 / outGamma) * (0xffff * 255/280); 

Ce morceau de code est écrit par Talarubi.

Un contraste beaucoup plus frappant par rapport à un CRT - le haut est l'original, le bas est la version avec correction des couleurs:





Émulation LCD: Game Boy Color


L'écran Game Boy Color était étonnamment meilleur pour reproduire les couleurs, et seul un léger flou de couleur peut être présent dans l'image finale.

L'algorithme suivant est assez populaire dans les émulateurs Game Boy Color:

  R = (r * 26 + g * 4 + b * 2);
 G = (g * 24 + b * 8);
 B = (r * 6 + g * 4 + b * 22);
 R = min (960, R) >> 2;
 G = min (960, G) >> 2;
 B = min (960, B) >> 2; 

Malheureusement, je ne sais pas qui a écrit l'algorithme. Si vous le savez, faites-le moi savoir afin que je puisse indiquer la paternité!

Comme précédemment, l'original à gauche, la version avec correction des couleurs - à droite:



Cet exemple a été spécialement choisi: bien que l'original soit plus vivant et préférable, si vous regardez de près, vous pouvez remarquer le motif d'échecs autour du personnage, qui est plus clair que l'arrière-plan.

Très probablement, c'était une erreur de la part des développeurs, car sur le vrai jeu
Les nuances de blanc Boy Color sont floues et deux nuances de couleurs différentes se confondent presque parfaitement.

En conclusion


Il existe de nombreux autres systèmes qui manquent toujours de bons filtres d'émulation de couleur.
Ils sont très difficiles à configurer. Parmi les exemples les plus importants figurent WonderSwan et Neo Geo Pocket, qui, au moment de la rédaction de ce document, ne disposaient pas de bons filtres pour approximer les couleurs.

Les consoles portables sont encore plus compliquées car elles manquent souvent de rétroéclairage (et parfois de lumière avant!) Et il existe des moyens de modifier le contraste, il n'y a donc pas de véritable valeur de couleur pour une valeur RVB spécifique.

Un cas limite particulièrement intéressant est WonderSwan Color, qui a un indicateur défini par logiciel pour augmenter le contraste de l'image affichée.
Nous ne savons pas encore comment émuler de manière fiable un tel comportement, et il est difficile de savoir si nous pouvons le faire du tout.

L'émulation des couleurs est un domaine qui nécessite plus d'attention, donc si vous êtes un spécialiste des mathématiques et de l'analyse des couleurs, votre aide serait très utile pour la scène d'émulation!

Source: https://habr.com/ru/post/fr467581/


All Articles