

Casi todas las consolas retro del juego generan colores en algunas de las opciones de codificación RGB.
Pero estos colores de píxeles a menudo están diseñados para pantallas que son completamente diferentes de aquellas en las que generalmente trabajan los emuladores. En este artículo hablaré sobre la importancia de la emulación de color, daré algunos ejemplos de código y capturas de pantalla.
El tipo más común de pantallas hoy en día son los paneles LCD. Son conocidos por tener niveles de negro muy pobres. Las diferencias entre TN, PVA e IPS no afectan demasiado esto.
Algunos fanáticos juegan en monitores CRT, y las pantallas OLED están ganando cada vez más popularidad, especialmente en teléfonos y tabletas. Pero en este artículo consideraremos principalmente las pantallas LCD, aunque esta técnica es importante para pantallas de cualquier tipo.
Precisión del color
El primer detalle importante: la mayoría de las computadoras funcionan en modo de color de 24 bits, proporcionando detalles de color de 8 bits para los canales rojo, verde y azul. Pero en la mayoría de los sistemas de juegos más antiguos, los colores no se configuran con tanta precisión.
Por ejemplo, Sega Genesis codifica colores de 9 bits, lo que da 3 bits por canal.
La solución más ingenua sería colocar 3 bits en los 3 bits más altos de la salida y dejar en blanco los 5 bits inferiores, pero el color blanco se vuelve un poco gris.
Un ejemplo:
000 000 000 -> 000'00000 000'00000 000'00000
111 111 111 -> 111'00000 111'00000 111'00000

Si los llenas con unidades, entonces el negro se vuelve demasiado claro.
Un ejemplo:
000 000 000 -> 000'11111 000'11111 000'11111
111 111 111 -> 111'11111 111'11111 111'11111

La solución es repetir los bits originales para que llenen todos los bits de salida.
Un ejemplo:
000 -> 000 000 00 ...
010 -> 010 010 01 ...
011 -> 011 011 01 ...
111 -> 111111 11 ...
En forma de código:
uint8 rojo = r << 5 | r << 2 | r >> 1
// rrr00000 | 000rrr00 | 000000rr -> rrrrrrrr
Emulación de pantalla
Los sistemas retro del juego no fueron diseñados para funcionar en monitores LCD modernos. Típicamente, las consolas domésticas se diseñaron para pantallas CRT, y las consolas portátiles usaron paneles LCD mucho más antiguos y menos precisos.
En este artículo, no consideraremos los artefactos de la pantalla, como la curvatura de la pantalla, las líneas de escaneo, la aberración cromática, la mezcla entre cuadros, las rejillas de apertura, etc., por ahora, nos centraremos solo en los colores de los píxeles individuales.
Monitores de PC
Los monitores tienen una gama bastante amplia de colores, porque solo algunos de ellos están calibrados profesionalmente según estándares como SRGB, pero en general, lo mejor que podemos hacer es tratar de emular colores como si estuviéramos usando un monitor SRGB correctamente calibrado.
Emulación CRT: Super Nintendo
La principal diferencia entre las pantallas CRT y los monitores LCD de las computadoras es la reducción significativa de los niveles de negro, que solo puede compensarse ligeramente con la curva de corrección gamma:
// Los colores SNES están en formato RGB555, por lo que hay 32 niveles para cada canal
constante estática 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
};
Esta tabla está tomada de Overload of Super Sleuth / Kindred. Oscurece la mitad inferior de la paleta de colores, dejando la parte superior sin cambios.
Esto tiene un efecto sorprendente en la imagen durante la emulación: el original se muestra a la izquierda, la imagen con corrección de gamma aplicada a la derecha:




Emulación LCD: Game Boy Advance
Game Boy Advance tenía una de las peores pantallas LCD con colores completamente desvaídos. Los astutos desarrolladores se dieron cuenta de que al exagerar significativamente los colores, uno puede obtener resultados más agradables en equipos reales.
Por supuesto, si usa estos colores en un monitor LCD estándar, el resultado será una pesadilla colorida. Afortunadamente, podemos compensar esto creando colores bastante naturales:
doble lcdGamma = 4.0, outGamma = 2.2;
doble lb = pow (B / 31.0, lcdGamma);
doble lg = pow (G / 31.0, lcdGamma);
doble 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);
Este fragmento de código está escrito por Talarubi.
Un contraste mucho más llamativo en comparación con un CRT: la parte superior es el original, la parte inferior es la versión con corrección de color:


Emulación LCD: Game Boy Color
La pantalla de Game Boy Color fue sorprendentemente mejor en la reproducción del color, y solo puede aparecer un ligero desenfoque de color en la imagen final.
El siguiente algoritmo es bastante popular en los emuladores de 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;
Desafortunadamente, no sé quién escribió el algoritmo. Si lo sabe, ¡hágamelo saber para que pueda indicar la autoría!
Como antes, el original a la izquierda, la versión con corrección de color, a la derecha:


Este ejemplo se eligió especialmente: aunque el original se ve más animado y preferible, si observa de cerca, puede notar el patrón de ajedrez alrededor del personaje, que es más claro que el fondo.
Lo más probable es que haya sido un descuido por parte de los desarrolladores, porque en el juego real
Los tonos de Boy Boy de color blanco se ven borrosos y dos tonos de color diferentes se fusionan entre sí de manera casi perfecta.
En conclusión
Hay muchos más sistemas que aún carecen de buenos filtros de emulación de color.
Son muy difíciles de configurar. Entre los ejemplos más importantes se encuentran WonderSwan y Neo Geo Pocket, que en el momento de escribir esto no tenía buenos filtros para aproximar los colores.
Las consolas portátiles son aún más complicadas porque a menudo carecen de luz de fondo (¡y a veces luz frontal!) Y hay formas de cambiar el contraste, por lo que no hay un valor de color verdadero para un valor RGB específico.
Un caso límite particularmente interesante es WonderSwan Color, que tiene una bandera configurada por software para aumentar el contraste de la imagen mostrada.
Todavía no sabemos cómo emular de manera confiable ese comportamiento, y no está claro si podemos hacerlo.
La emulación de color es un área que requiere más atención, por lo que si eres un especialista en matemáticas y análisis de color, ¡tu ayuda sería muy útil para la escena de la emulación!