Saya sedang mengerjakan game mirip Megaman di mana saya perlu mengubah warna piksel tertentu saat runtime. Untuk referensi : di Megaman ketika Anda mengubah senjata yang Anda pilih maka palet karakter utama berubah untuk mencerminkan senjata yang dipilih. Tidak semua warna sprite berubah, hanya yang tertentu yang berubah .
Efek semacam ini biasa dan cukup mudah dilakukan pada SEN karena programmer memiliki akses ke palet dan pemetaan logis antara piksel dan indeks palet. Pada perangkat keras modern, ini sedikit lebih menantang karena konsep paletnya tidak sama.
Semua tekstur saya 32-bit dan tidak menggunakan palet.
Ada dua cara yang saya tahu untuk mencapai efek yang saya inginkan, tetapi saya ingin tahu apakah ada cara yang lebih baik untuk mencapai efek ini dengan mudah. Dua opsi yang saya tahu adalah:
- Gunakan shader dan tulis beberapa GLSL untuk melakukan perilaku "swapping palet".
- Jika shader tidak tersedia (katakanlah, karena kartu grafis tidak mendukungnya) maka dimungkinkan untuk mengkloning tekstur "asli" dan menghasilkan versi yang berbeda dengan perubahan warna yang sudah diterapkan sebelumnya.
Idealnya saya ingin menggunakan shader karena tampaknya mudah dan memerlukan sedikit kerja tambahan yang bertentangan dengan metode duplikat-tekstur. Saya khawatir duplikat tekstur hanya untuk mengubah warna di dalamnya membuang-buang VRAM - haruskah saya tidak khawatir tentang itu?
Sunting : Saya akhirnya menggunakan teknik jawaban yang diterima dan inilah shader saya untuk referensi.
uniform sampler2D texture;
uniform sampler2D colorTable;
uniform float paletteIndex;
void main()
{
vec2 pos = gl_TexCoord[0].xy;
vec4 color = texture2D(texture, pos);
vec2 index = vec2(color.r + paletteIndex, 0);
vec4 indexedColor = texture2D(colorTable, index);
gl_FragColor = indexedColor;
}
Kedua tekstur 32-bit, satu tekstur digunakan sebagai tabel pencarian yang mengandung beberapa palet yang semuanya berukuran sama (dalam kasus saya 6 warna). Saya menggunakan saluran merah pixel sumber sebagai indeks ke tabel warna. Ini bekerja seperti pesona untuk mencapai swapping palet seperti Megaman!