Saya telah mencoba untuk mengerjakan game dengan tampilan game 8-bit menggunakan XNA, khususnya menggunakan NES sebagai panduan.
SEN memiliki palet yang sangat spesifik dan setiap sprite dapat menggunakan hingga 4 warna dari palet itu. Bagaimana saya bisa meniru ini? Cara saya saat ini mencapai hal ini adalah saya memiliki tekstur dengan nilai-nilai yang ditetapkan yang bertindak sebagai indeks untuk berbagai warna yang saya berikan ke GPU. Saya membayangkan harus ada cara yang lebih baik dari ini, tetapi mungkin ini cara terbaik?
Saya tidak ingin memastikan saya menggambar setiap sprite dengan warna yang tepat karena saya ingin dapat mengubah palet secara dinamis. Saya juga lebih suka untuk tidak mengubah tekstur secara langsung menggunakan CPU.
Apakah lambat untuk membuat kelas komposit yang dapat berisi hingga 4 objek yang merupakan salah satu dari masing-masing warna untuk sprite dan menggabungkannya ke dalam sprite yang digambar. Jadi masing-masing sprite adalah gabungan hingga 4 sprite yang digabungkan dan kemudian digambar.
Kemudian Anda bisa mengubah 1 warna melalui kelas itu dan seluruh sprite akan berubah.
(perhatikan, saya belum melakukan XNA tetapi ini mungkin memicu beberapa ide dengan Anda.)
sumber
Jika Anda sama sekali tidak peduli dengan kinerja memori, Anda dapat menyimpan sprite Anda tanpa kompresi sehingga piksel dengan warna 0 berwarna merah murni, 1 berwarna hijau murni, 2 berwarna biru murni, dan 3 adalah alpha murni.
Saat hendak membuat sprite, tetapkan konstanta pixel shader matriks yang terbuat dari empat vektor yang sesuai dengan warna 0, 1, 2, 3. Dalam pixel shader, jalankan kode berikut untuk mewarnai ulang sprite texel:
Ini berfungsi karena ketika sebuah pixel berwarna 0, itu adalah merah murni, dan akhirnya akan menjadi
atau
dan hal yang sama berlaku untuk warna 1, 2, dan 3.
Jika Anda peduli dengan kinerja memori, maka simpan palet NES Anda sebagai 256x1 RGB tekstur terkompresi, atur penyaringan tekstur ke tetangga terdekat, simpan sprite Anda sebagai tekstur 8-channel single-channel terkompresi, dan lakukan kode shader seperti ini :
sumber