Çalışma zamanında belirli piksellerin rengini değiştirmem gereken Megaman benzeri bir oyun üzerinde çalışıyorum . Başvuru için : seçtiğiniz silahı değiştirdiğinizde Megaman'da ana karakterin paleti seçilen silahı yansıtacak şekilde değişir. Sprite’ın renklerinin tümü değişmez, sadece bazıları değişir .
Bu tür bir etki, programcının palete ve pikseller ve palet endeksleri arasındaki mantıksal haritaya erişimi olduğundan, NES üzerinde oldukça yaygındı ve yapmak oldukça kolaydı. Modern donanımda, bu biraz daha zordur çünkü paletler aynı değildir.
Dokularımın tümü 32 bit ve palet kullanmıyor.
İstediğim efekti elde etmek için bildiğim iki yol var, ancak bu efekti kolayca elde etmenin daha iyi yolları olup olmadığını merak ediyorum. Bildiğim iki seçenek:
- Bir gölgelendirici kullanın ve "palet değiştirme" davranışını gerçekleştirmek için bir miktar GLSL yazın.
- Gölgelendiriciler mevcut değilse (örneğin, grafik kartı onları desteklemediğinden), o zaman "orijinal" dokuları klonlamak ve önceden uygulanan renk değişiklikleriyle farklı sürümler oluşturmak mümkündür.
İdeal olarak, bir gölgelendirici kullanmak istiyorum, çünkü basit görünüyor ve çoğaltılmış doku yönteminin aksine çok az ek çalışma gerektiriyor. Dokulardaki renkleri değiştirmek için kopyalayan dokuların VRAM'yi boşa harcadığından endişe ediyorum - bu konuda endişelenmemeli miyim?
Düzenleme : Kabul edilen cevap tekniğini kullanarak bitirdim ve işte referans olarak gölgelendiricim.
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;
}
Her iki doku da 32-bit'dir, bir doku, hepsi aynı boyutta (benim durumumda 6 renk) birkaç paleti içeren arama tablosu olarak kullanılır. Kaynak pikselin kırmızı kanalını renk tablosuna bir dizin olarak kullanıyorum. Bu Megaman benzeri palet takas başarmak için bir cazibe gibi çalıştı!