Sto lavorando a un gioco simile a Megaman in cui ho bisogno di cambiare il colore di alcuni pixel in fase di esecuzione. Per riferimento : in Megaman quando cambi l'arma selezionata, la tavolozza del personaggio principale cambia per riflettere l'arma selezionata. Non tutti i colori dello sprite cambiano, solo alcuni lo fanno .
Questo tipo di effetto era comune e abbastanza facile da eseguire sul NES poiché il programmatore aveva accesso alla tavolozza e alla mappatura logica tra pixel e indici della tavolozza. Sull'hardware moderno, tuttavia, questo è un po 'più impegnativo perché il concetto di palette non è lo stesso.
Tutte le mie trame sono a 32 bit e non usano le tavolozze.
Ci sono due modi che conosco per ottenere l'effetto che desidero, ma sono curioso di sapere se ci sono modi migliori per ottenere facilmente questo effetto. Le due opzioni che conosco sono:
- Usa uno shader e scrivi un po 'di GLSL per eseguire il comportamento di "scambio di palette".
- Se gli shader non sono disponibili (ad esempio, perché la scheda grafica non li supporta), è possibile clonare le trame "originali" e generare versioni diverse con i cambiamenti di colore pre-applicati.
Idealmente, vorrei usare uno shader poiché sembra semplice e richiede poco lavoro aggiuntivo rispetto al metodo a texture duplicata. Temo che duplicare le trame solo per cambiarne un colore stia sprecando VRAM - non dovrei preoccuparmene?
Modifica : ho finito per usare la tecnica della risposta accettata ed ecco il mio shader per riferimento.
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;
}
Entrambe le trame sono a 32 bit, una trama viene utilizzata come tabella di ricerca contenente diverse tavolozze che hanno tutte le stesse dimensioni (nel mio caso 6 colori). Uso il canale rosso del pixel sorgente come indice della tabella dei colori. Questo ha funzionato come un incantesimo per ottenere lo scambio di palette simile a Megaman!