Ich arbeite an einem Megaman- ähnlichen Spiel, bei dem ich zur Laufzeit die Farbe bestimmter Pixel ändern muss. Als Referenz : Wenn Sie in Megaman Ihre ausgewählte Waffe ändern, ändert sich die Palette des Hauptcharakters entsprechend der ausgewählten Waffe. Nicht alle Farben des Sprites ändern sich, nur bestimmte .
Diese Art von Effekt war weit verbreitet und auf dem NES recht einfach zu erzielen, da der Programmierer Zugriff auf die Palette und die logische Zuordnung zwischen Pixeln und Palettenindizes hatte. Bei moderner Hardware ist dies jedoch etwas schwieriger, da das Konzept der Paletten nicht dasselbe ist.
Alle meine Texturen sind 32-Bit und verwenden keine Paletten.
Ich kenne zwei Möglichkeiten, um den gewünschten Effekt zu erzielen. Ich bin jedoch gespannt, ob es bessere Möglichkeiten gibt, diesen Effekt auf einfache Weise zu erzielen. Die beiden mir bekannten Optionen sind:
- Verwenden Sie einen Shader und schreiben Sie etwas GLSL, um das Verhalten "Palettentausch" auszuführen.
- Wenn Shader nicht verfügbar sind (z. B. weil sie von der Grafikkarte nicht unterstützt werden), können Sie die "ursprünglichen" Texturen klonen und mit den vorab angewendeten Farbänderungen verschiedene Versionen erstellen.
Im Idealfall würde ich gerne einen Shader verwenden, da dieser unkompliziert zu sein scheint und im Gegensatz zur Methode der duplizierten Textur nur wenig zusätzliche Arbeit erfordert. Ich mache mir Sorgen, dass das Duplizieren von Texturen, nur um eine Farbe in ihnen zu ändern, VRAM verschwendet - sollte ich mir darüber keine Sorgen machen?
Bearbeiten : Ich habe die Technik der akzeptierten Antwort verwendet und hier ist mein Shader als Referenz.
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;
}
Beide Texturen sind 32-Bit, eine Textur wird als Nachschlagetabelle verwendet, die mehrere Paletten enthält, die alle die gleiche Größe haben (in meinem Fall 6 Farben). Ich verwende den roten Kanal des Quellpixels als Index für die Farbtabelle. Dies hat wie ein Zauber gewirkt, um einen Megaman-ähnlichen Palettentausch zu erreichen!