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):
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?
Jawaban:
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 lakukanKemudian 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:
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.
sumber
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.
sumber