Korrekte Farbwiedergabe von Retroconsolen in Emulatoren



Fast alle Spiel-Retro-Konsolen erzeugen Farben in einigen der RGB-Codierungsoptionen.

Diese Pixelfarben werden jedoch häufig für Bildschirme entwickelt, die sich grundlegend von denen unterscheiden, auf denen Emulatoren normalerweise arbeiten. In diesem Artikel werde ich über die Bedeutung der Farbemulation sprechen und einige Codebeispiele und Screenshots geben.

Die heute am häufigsten verwendeten Arten von Displays sind LCD-Panels. Sie sind dafür bekannt, sehr schlechte Schwarzwerte zu haben. Die Unterschiede zwischen TN, PVA und IPS wirken sich nicht allzu stark darauf aus.

Einige Fans spielen auf CRT-Monitoren, und OLED-Bildschirme werden immer beliebter, insbesondere auf Telefonen und Tablets. In diesem Artikel werden jedoch hauptsächlich LCD-Bildschirme betrachtet, obwohl diese Technik für Displays jeglicher Art wichtig ist.

Farbgenauigkeit


Das erste wichtige Detail: Die meisten Computer arbeiten im 24-Bit-Farbmodus und bieten 8-Bit-Farbdetails für die Kanäle Rot, Grün und Blau. In den meisten älteren Spielesystemen werden die Farben jedoch nicht so präzise eingestellt.

Zum Beispiel codiert Sega Genesis 9-Bit-Farben, was 3 Bit pro Kanal ergibt.

Die naivste Lösung wäre, 3 Bits in die höchsten 3 Bits der Ausgabe zu setzen und die unteren 5 Bits leer zu lassen, aber die weiße Farbe wird ein wenig grau.

Ein Beispiel:

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



Wenn Sie sie mit Einheiten füllen, wird Schwarz zu hell.

Ein Beispiel:

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



Die Lösung besteht darin, die ursprünglichen Bits so zu wiederholen, dass sie alle Ausgangsbits füllen.

Ein Beispiel:

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

In Form von Code:

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

Bildschirmemulation


Spiel-Retro-Systeme wurden nicht für moderne LCD-Computermonitore entwickelt. In der Regel wurden Heimkonsolen für CRT-Bildschirme entwickelt, und tragbare Konsolen verwendeten viel ältere und weniger genaue LCD-Panels.

In diesem Artikel werden Bildschirmartefakte wie Bildschirmkrümmung, Scanlinien, chromatische Aberration, Interframe-Überblendung, Aperturgitter usw. nicht berücksichtigt. Im Moment konzentrieren wir uns nur auf die Farben einzelner Pixel.

PC-Monitore


Monitore haben eine ziemlich große Auswahl an Farben, da nur einige von ihnen professionell nach Standards wie SRGB kalibriert sind. Im Allgemeinen können wir jedoch versuchen, Farben so zu emulieren, als ob wir einen korrekt kalibrierten SRGB-Monitor verwenden.

CRT-Emulation: Super Nintendo


Der Hauptunterschied zwischen CRT-Bildschirmen und LCD-Monitoren von Computern besteht in den deutlich reduzierten Schwarzwerten, die durch die Gammakorrekturkurve nur geringfügig kompensiert werden können:

  // SNES-Farben sind im RGB555-Format, daher gibt es 32 Pegel für jeden Kanal
 statische Konstante 8 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
 }; 

Diese Tabelle wurde von Overload of Super Sleuth / Kindred ausgeliehen. Es verdeckt die untere Hälfte der Farbpalette und lässt den oberen Teil unverändert.

Dies hat einen erstaunlichen Effekt auf das Bild während der Emulation: Das Original wird links angezeigt, das Bild mit der Gammakorrektur rechts:





LCD-Emulation: Game Boy Advance


Game Boy Advance hatte einen der schlechtesten LCD-Bildschirme mit vollständig verblassten Farben. Die schlauen Entwickler erkannten, dass man durch deutliches Übertreiben der Farben auf realen Geräten angenehmere Ergebnisse erzielen kann.

Wenn Sie diese Farben auf einem Standard-LCD-Monitor verwenden, ist das Ergebnis natürlich ein bunter Albtraum. Glücklicherweise können wir dies kompensieren, indem wir ziemlich natürliche Farben erzeugen:

  doppeltes lcdGamma = 4,0, outGamma = 2,2;
 doppeltes lb = pow (B / 31,0, lcdGamma);
 doppeltes lg = pow (G / 31,0, lcdGamma);
 doppeltes 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) * (0 · ffff · 255/280);
 b = pow ((220 * lb + 10 * log + 50 * lr) / 255, 1 / outGamma) * (0xffff * 255/280); 

Dieser Code wurde von Talarubi geschrieben.

Ein viel auffälligerer Kontrast im Vergleich zu einer CRT - die Oberseite ist das Original, die Unterseite ist die Version mit Farbkorrektur:





LCD-Emulation: Game Boy Color


Der Game Boy-Farbbildschirm war überraschend besser in der Farbwiedergabe, und im endgültigen Bild ist möglicherweise nur eine leichte Farbunschärfe vorhanden.

Der folgende Algorithmus ist in Game Boy Color-Emulatoren sehr beliebt:

  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; 

Leider weiß ich nicht, wer den Algorithmus geschrieben hat. Wenn Sie es wissen, lassen Sie es mich wissen, damit ich die Urheberschaft angeben kann!

Nach wie vor das Original links, die Version mit Farbkorrektur - rechts:



Dieses Beispiel wurde speziell ausgewählt: Obwohl das Original lebendiger und vorzuziehen ist, können Sie bei genauem Hinsehen das Schachmuster um die Figur herum erkennen, das heller als der Hintergrund ist.

Höchstwahrscheinlich war es ein Versehen seitens der Entwickler, denn im realen Spiel
Boy Color-Weißtöne verschwimmen und zwei verschiedene Farbtöne verschmelzen nahezu fehlerfrei miteinander.

Abschließend


Es gibt viel mehr Systeme, denen noch gute Farbemulationsfilter fehlen.
Sie sind sehr schwer zu konfigurieren. Zu den wichtigsten Beispielen gehören WonderSwan und Neo Geo Pocket, die zum Zeitpunkt dieses Schreibens keine guten Filter zur Approximation von Farben hatten.

Tragbare Konsolen sind immer noch komplizierter, da ihnen häufig die Hintergrundbeleuchtung (und manchmal auch die Frontbeleuchtung!) Fehlen. Es gibt Möglichkeiten, den Kontrast zu ändern, sodass für einen bestimmten RGB-Wert kein echter Farbwert vorhanden ist.

Ein besonders interessanter Grenzfall ist WonderSwan Color, das über ein Software-Set-Flag verfügt, um den Kontrast des angezeigten Bildes zu erhöhen.
Wir wissen noch nicht, wie wir ein solches Verhalten zuverlässig nachahmen können, und es ist unklar, ob wir es überhaupt schaffen können.

Die Farbemulation ist ein Bereich, der mehr Aufmerksamkeit erfordert. Wenn Sie also Spezialist für Mathematik und Farbanalyse sind, ist Ihre Hilfe für die Emulationsszene sehr nützlich!

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


All Articles