

Hampir semua konsol game retro menghasilkan warna di beberapa opsi pengkodean RGB.
Tetapi warna-warna piksel ini sering dirancang untuk layar yang sama sekali berbeda dari yang biasanya digunakan oleh emulator. Pada artikel ini saya akan berbicara tentang pentingnya emulasi warna, saya akan memberikan beberapa contoh kode dan tangkapan layar.
Jenis tampilan yang paling umum saat ini adalah panel LCD. Mereka dikenal memiliki tingkat hitam yang sangat buruk. Perbedaan antara TN, PVA, dan IPS tidak terlalu memengaruhi ini.
Beberapa penggemar bermain di monitor CRT, dan layar OLED semakin populer, terutama pada ponsel dan tablet. Tetapi dalam artikel ini kita terutama akan mempertimbangkan layar LCD, meskipun teknik ini penting untuk tampilan jenis apa pun.
Akurasi warna
Detail penting pertama: kebanyakan komputer beroperasi dalam mode warna 24-bit, memberikan detail warna 8-bit untuk saluran merah, hijau, dan biru. Namun di sebagian besar sistem permainan yang lebih tua, warna tidak diatur dengan presisi seperti itu.
Misalnya, Sega Genesis mengkodekan warna 9-bit, yang menghasilkan 3 bit per saluran.
Solusi yang paling naif adalah menempatkan 3 bit dalam 3 bit tertinggi dari output, dan membiarkan 5 bit lebih rendah, tetapi warna putih menjadi sedikit abu-abu.
Contoh:
000 000 000 -> 000'00000 000'00000 000'00000
111 111 111 -> 111'00000 111'00000 111'00000

Jika Anda mengisinya dengan unit, maka hitam menjadi terlalu terang.
Contoh:
000 000 000 -> 000'11111 000'11111 000'11111
111 111 111 -> 111'11111 111'11111 111'11111

Solusinya adalah mengulangi bit asli sehingga mereka mengisi semua bit output.
Contoh:
000 -> 000 000 00 ...
010 -> 010 010 01 ...
011 -> 011 011 01 ...
111 -> 111 111 11 ...
Dalam bentuk kode:
uint8 red = r << 5 | r << 2 | r >> 1
// rrr00000 | 000rrr00 | 000000rr -> rrrrrrrr
Emulasi layar
Sistem game retro tidak dirancang untuk bekerja pada monitor komputer LCD modern. Biasanya, konsol rumah dirancang untuk layar CRT, dan konsol portabel menggunakan panel LCD yang jauh lebih tua dan kurang akurat.
Dalam artikel ini, kami tidak akan mempertimbangkan artefak layar, seperti kelengkungan layar, garis pindai, aberasi kromatik, pencampuran antar bingkai, kisi aperture, dll. Untuk saat ini, kami hanya akan fokus pada warna piksel individu.
Monitor PC
Monitor memiliki rentang warna yang cukup luas, karena hanya beberapa dari mereka yang dikalibrasi secara profesional dengan standar seperti SRGB, tetapi secara umum, yang terbaik yang bisa kita lakukan adalah mencoba meniru warna seolah-olah kita menggunakan monitor SRGB yang dikalibrasi dengan benar.
Emulasi CRT: Super Nintendo
Perbedaan utama antara layar CRT dan monitor LCD komputer adalah tingkat hitam yang berkurang secara signifikan, yang hanya dapat sedikit dikompensasi oleh kurva koreksi gamma:
// Warna SNES dalam format RGB555, jadi ada 32 level untuk setiap saluran
static const 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
};
Tabel ini dipinjam dari Overload Super Sleuth / Kindred. Ini mengaburkan bagian bawah palet warna, meninggalkan bagian atas tidak berubah.
Ini memiliki efek luar biasa pada gambar selama emulasi: aslinya ditampilkan di sebelah kiri, gambar dengan koreksi gamma diterapkan di kanan:




LCD Emulation: Game Boy Advance
Game Boy Advance memiliki salah satu layar LCD terburuk dengan warna yang sepenuhnya pudar. Pengembang yang licik menyadari bahwa dengan membesar-besarkan warna secara signifikan, seseorang dapat memperoleh hasil yang lebih menyenangkan pada peralatan nyata.
Tentu saja, jika Anda menggunakan warna-warna ini pada monitor LCD standar, hasilnya akan menjadi mimpi buruk yang penuh warna. Untungnya, kami dapat mengimbanginya dengan menciptakan warna yang cukup alami:
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 * log + 10 * lr) / 255, 1 / outGamma) * (0xffff * 255/280);
b = pow ((220 * lb + 10 * log + 50 * lr) / 255, 1 / outGamma) * (0xffff * 255/280);
Sepotong kode ini ditulis oleh Talarubi.
Kontras yang jauh lebih mencolok dibandingkan dengan CRT - bagian atas adalah yang asli, bagian bawah adalah versi dengan koreksi warna:


LCD Emulation: Game Boy Color
Layar Game Boy Color secara mengejutkan lebih baik dalam mereproduksi warna, dan hanya sedikit kekaburan warna yang ada pada gambar akhir.
Algoritme berikut cukup populer di emulator 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;
Sayangnya, saya tidak tahu siapa yang menulis algoritma. Jika Anda tahu, maka beri tahu saya agar saya dapat menunjukkan kepengarangan!
Seperti sebelumnya, dokumen asli di sebelah kiri, versi dengan koreksi warna - di sebelah kanan:


Contoh ini dipilih secara khusus: meskipun aslinya terlihat lebih hidup dan disukai, jika Anda perhatikan lebih dekat, Anda dapat melihat pola catur di sekitar karakter, yang lebih ringan dari latar belakang.
Kemungkinan besar, itu adalah kekhilafan dari pihak pengembang, karena pada Game nyata
Warna Boy Boy warna putih buram dan dua warna yang berbeda menyatu satu sama lain hampir tanpa cacat.
Kesimpulannya
Ada banyak lagi sistem yang masih kekurangan filter emulasi warna yang bagus.
Mereka sangat sulit dikonfigurasi. Di antara contoh yang paling penting adalah WonderSwan dan Neo Geo Pocket, yang pada saat penulisan ini tidak memiliki filter yang baik untuk perkiraan warna.
Konsol portabel masih lebih rumit karena mereka sering kekurangan cahaya latar (dan kadang-kadang lampu depan!) Dan ada cara untuk mengubah kontras, sehingga tidak ada nilai warna sejati untuk nilai RGB tertentu.
Case borderline yang sangat menarik adalah WonderSwan Color, yang memiliki flag set perangkat lunak untuk meningkatkan kontras gambar yang ditampilkan.
Kami belum tahu cara meniru perilaku seperti itu, dan tidak jelas apakah kami bisa melakukannya sama sekali.
Emulasi warna adalah bidang yang membutuhkan lebih banyak perhatian, jadi jika Anda seorang spesialis dalam matematika dan analisis warna, maka bantuan Anda akan sangat berguna untuk adegan emulasi!