Pudar di game yang lebih lama. Butuh bantuan untuk mencari tahu bagaimana algoritma itu diturunkan

12

Maaf, pertanyaan ini agak esoteris, tetapi saya tidak bisa mengeluarkannya dari kepala saya!

Saya melihat algoritma fade yang digunakan dalam game arcade DoDonPachi (dan juga banyak game lama lainnya):

masukkan deskripsi gambar di sini

Saya menulis skrip python untuk memilih beberapa piksel dan melacaknya selama durasi pudar. Inilah contoh yang representatif dari hasilnya. Baris pertama dari setiap grup adalah nilai warna awal, sedangkan setiap baris berikutnya adalah perbedaan antara nilai warna dari frame saat ini dan nilai warna dari frame sebelumnya.

Starting Value: (132, 66, 189)
Frame 1:    [9, 9, 8]
Frame 2:    [8, 8, 8]
Frame 3:    [8, 8, 8]
Frame 4:    [8, 8, 9]
Frame 5:    [9, 9, 8]
Frame 6:    [8, 8, 8]
Frame 7:    [8, 8, 8]
Frame 8:    [8, 8, 9]
Frame 9:    [9, 0, 8]
Frame 10:   [8, 0, 8]
Frame 11:   [8, 0, 8]
Frame 12:   [8, 0, 9]
Frame 13:   [9, 0, 8]
Frame 14:   [8, 0, 8]
Frame 15:   [8, 0, 8]
Frame 16:   [8, 0, 9]
Frame 17:   [0, 0, 8]
Frame 18:   [0, 0, 8]
Frame 19:   [0, 0, 8]
Frame 20:   [0, 0, 9]
Frame 21:   [0, 0, 8]
Frame 22:   [0, 0, 8]
Frame 23:   [0, 0, 8]
Frame 24:   [0, 0, 0]
Frame 25:   [0, 0, 0]
Frame 26:   [0, 0, 0]
Frame 27:   [0, 0, 0]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Starting Value: (132, 0, 0)
Frame 1:    [9, 0, 0]
Frame 2:    [8, 0, 0]
Frame 3:    [8, 0, 0]
Frame 4:    [8, 0, 0]
Frame 5:    [9, 0, 0]
Frame 6:    [8, 0, 0]
Frame 7:    [8, 0, 0]
Frame 8:    [8, 0, 0]
Frame 9:    [9, 0, 0]
Frame 10:   [8, 0, 0]
Frame 11:   [8, 0, 0]
Frame 12:   [8, 0, 0]
Frame 13:   [9, 0, 0]
Frame 14:   [8, 0, 0]
Frame 15:   [8, 0, 0]
Frame 16:   [8, 0, 0]
Frame 17:   [0, 0, 0]
Frame 18:   [0, 0, 0]
Frame 19:   [0, 0, 0]
Frame 20:   [0, 0, 0]
Frame 21:   [0, 0, 0]
Frame 22:   [0, 0, 0]
Frame 23:   [0, 0, 0]
Frame 24:   [0, 0, 0]
Frame 25:   [0, 0, 0]
Frame 26:   [0, 0, 0]
Frame 27:   [0, 0, 0]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Starting Value: (165, 156, 222)
Frame 1:    [9, 8, 8]
Frame 2:    [8, 8, 8]
Frame 3:    [8, 8, 8]
Frame 4:    [8, 9, 9]
Frame 5:    [9, 8, 8]
Frame 6:    [8, 8, 8]
Frame 7:    [8, 8, 8]
Frame 8:    [8, 9, 9]
Frame 9:    [9, 8, 8]
Frame 10:   [8, 8, 8]
Frame 11:   [8, 8, 8]
Frame 12:   [8, 9, 9]
Frame 13:   [9, 8, 8]
Frame 14:   [8, 8, 8]
Frame 15:   [8, 8, 8]
Frame 16:   [8, 9, 9]
Frame 17:   [9, 8, 8]
Frame 18:   [8, 8, 8]
Frame 19:   [8, 8, 8]
Frame 20:   [8, 0, 9]
Frame 21:   [0, 0, 8]
Frame 22:   [0, 0, 8]
Frame 23:   [0, 0, 8]
Frame 24:   [0, 0, 9]
Frame 25:   [0, 0, 8]
Frame 26:   [0, 0, 8]
Frame 27:   [0, 0, 8]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Starting Value: (156, 90, 206)
Frame 1:    [8, 8, 8]
Frame 2:    [8, 8, 9]
Frame 3:    [8, 8, 8]
Frame 4:    [9, 9, 8]
Frame 5:    [8, 8, 8]
Frame 6:    [8, 8, 9]
Frame 7:    [8, 8, 8]
Frame 8:    [9, 9, 8]
Frame 9:    [8, 8, 8]
Frame 10:   [8, 8, 9]
Frame 11:   [8, 8, 8]
Frame 12:   [9, 0, 8]
Frame 13:   [8, 0, 8]
Frame 14:   [8, 0, 9]
Frame 15:   [8, 0, 8]
Frame 16:   [9, 0, 8]
Frame 17:   [8, 0, 8]
Frame 18:   [8, 0, 9]
Frame 19:   [8, 0, 8]
Frame 20:   [0, 0, 8]
Frame 21:   [0, 0, 8]
Frame 22:   [0, 0, 9]
Frame 23:   [0, 0, 8]
Frame 24:   [0, 0, 8]
Frame 25:   [0, 0, 8]
Frame 26:   [0, 0, 0]
Frame 27:   [0, 0, 0]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Seperti yang Anda lihat, angka 8 atau 9 dikurangi dari setiap komponen warna di setiap bingkai. Selain itu, 9 selalu muncul tiga frame setelah 8, meskipun nilai awal yang dikurangi berbeda untuk setiap komponen warna. Perhatikan juga bahwa setiap komponen warna mencapai 0 (yaitu, hitam) dengan perbedaan antara 8 atau 9, bukan sisa yang sewenang-wenang. Ini berarti bahwa siklus nilai yang dikurangi 8,8,8,9 tidak pernah rusak! (Algoritma ini mungkin ditulis untuk memastikan bahwa frame terakhir fade semulus yang lain.)

Sekarang, ini membingungkan saya. Menurut perhitungan saya, jika Anda membalikkan proses - yaitu, ambil siklus 8,8,8,9 dan jumlah itu untuk menemukan semua kombinasi yang mungkin dalam 29 frame - Anda hanya mendapatkan 52 angka unik. Tetapi ketika hal itu terjadi, setiap komponen warna adalah anggota set ini! Ini berarti bahwa salah satu warna dipilih secara khusus untuk algoritma fade ini (tidak mungkin), atau bahwa algoritma fade dirancang di sekitar palet warna permainan. Tetapi bagaimana mungkin seseorang dapat mengetahui bahwa jika Anda mengambil 8,8,8,9, menggeser siklus dengan tepat, dan terus mengurangi angka dari setiap komponen warna dalam palet Anda, Anda akhirnya akan mencapai 0 untuk setiap warna tunggal? ! Pasti ada trik matematika yang saya lewatkan. Apa itu?

Archagon
sumber
2
Kenapa tidak bermain-main dengan alpha? Itulah yang saya lakukan untuk animasi fade-in / out.
DogDog
Saya tidak mencoba mereplikasi algoritma dalam kode saya sendiri, hanya mencoba mencari tahu bagaimana itu diturunkan.
Archagon
Saya merasa seperti apa yang Anda katakan, warna dipilih berdasarkan urutan 8,8,8,9. Mengingat urutan yang mereka dapat memilih dari 52 * 52 * 52 warna. Catatan yang menarik, jika Anda mulai dari 0 dan menambahkan urutan 8,8,8,9 Anda akan mencapai 255. Yang memungkinkan mereka untuk menggunakan hitam dan putih.
Luis Estrada
@Apoc: Gaya fade-out tampak berbeda dari alpha fade. Lihat bagaimana setiap nilai warna turun dengan angka tetap (pola angka) daripada persentase dari nilai awal itu? Ini berarti bahwa ada keadaan di mana Anda lebih suka menggunakannya daripada metode yang lebih umum. Gaya retro, misalnya.
AlbeyAmakiir

Jawaban:

20

Sebenarnya, ada logika sederhana di balik pola 8-8-8-9. Itu muncul secara alami jika Anda hanya menggunakan tingkat intensitas 32 (5 bit per komponen), tetapi ingin membuatnya pada tampilan 8-bit per komponen.

Pertimbangkan jika Anda memiliki tingkat intensitas 5-bit dan ingin memperpanjangnya menjadi 8 bit. Hal paling sederhana untuk dilakukan adalah dengan hanya menggeser-kiri dan membiarkan tiga bit rendah nol. Masalahnya adalah, maka tidak sampai putih murni. Level intensitas tertinggi yang dapat Anda capai adalah 11111000, atau 248. Jadi Anda tidak menggunakan rentang intensitas penuh tampilan 8-bit.

Sungguh, yang ingin Anda lakukan adalah perhitungan intensity8 = round(intensity5 * 255.0 / 31.0), untuk mengubah skala kisaran [0, 31] menjadi [0, 255]. Namun, ada trik yang rapi untuk mencapai ini tanpa ada matematika floating-point atau membagi: mengatur tiga bit rendah sama dengan tiga bit tinggi. Artinya, untuk mengkonversi intensitas dari 5-bit ke 8-bit yang akan Anda lakukan

intensity8 = (intensity5 << 3) | (intensity5 >> 2);

Kemudian intensitas 11111 akan memetakan ke 11111111 (31 peta ke 255), dan hasil antara akan melakukan sesuatu yang waras juga, misalnya 10000 -> 10000100 (16 -> 132).

Kumpulan angka ini persis seperti yang Anda miliki. Mengambil komponen merah dari contoh pertama Anda, Anda memiliki:

132    10000100
123    01111011
115    01110011
107    01101011
 99    01100011
 90    01011010
 82    01010010
 74    01001010

Perhatikan bagaimana tiga bit rendah selalu sama dengan tiga bit teratas. Perbedaan 9 terjadi ketika bit 0 dan bit 3 flip pada saat yang sama.

Saya tidak yakin mengapa tingkat intensitas 5-bit akan digunakan dalam situasi ini; mungkin itu adalah batas perangkat keras dari mesin arcade? Perlu dicatat bahwa nilai RGB 5-bit adalah 15 bit, yang cocok dengan kata 16-bit. Bagaimanapun, itu menjelaskan pola aneh 8-8-8-9.

Nathan Reed
sumber
1
16 bit per pixel disebut 'High Color'. (Hanya itu yang saya ingat tentang hal itu) en.wikipedia.org/wiki/High_color
tug
1
Setelah perjalanan singkat melalui wikipedia, Sega Saturn ( en.wikipedia.org/wiki/Sega_Saturn#Video ) menyebutkan mode tampilan warna 15-bit, serta GameBoy Advance ( en.wikipedia.org/wiki/Game_Boy_Advance )
tug
1
Itu brilian! Itu semua masuk akal sekarang. Terima kasih!
Archagon
Permainan harus memiliki warna 16-bit, dan para seniman mungkin ingin memeras lebih banyak warna dari permainan mereka dengan mengorbankan transparansi, memberikan skema warna RGBA 5551.
Archagon
0

Anda harus melihat ke mode 13h, atau 256 warna palet memudar. Saat itu, Anda memiliki banyak warna dan apa yang Anda lakukan, sedang bermain-main dengan seluruh palet, karena Anda tidak dapat menghitung warna baru yang tidak ada di dalamnya.

Penghapus
sumber