Je travaille sur un jeu ressemblant à Megaman où je dois changer la couleur de certains pixels au moment de l'exécution. Pour référence : dans Megaman, lorsque vous changez d'arme sélectionnée, la palette du personnage principal change pour refléter l'arme sélectionnée. Toutes les couleurs du sprite ne changent pas, seulement certaines changent .
Ce type d’effet était courant et assez facile à faire sur la NDA puisque le programmeur avait accès à la palette et au mappage logique entre les pixels et les index de la palette. Sur un matériel moderne, cependant, cela pose un peu plus de problèmes car le concept de palettes n’est pas le même.
Toutes mes textures sont en 32 bits et n'utilisent pas de palettes.
Je sais qu'il existe deux manières d'obtenir l'effet souhaité, mais je suis curieux de savoir s'il existe de meilleurs moyens d'obtenir cet effet facilement. Les deux options que je connais sont:
- Utilisez un shader et écrivez du GLSL pour effectuer le comportement "permutation de palette".
- Si les shaders ne sont pas disponibles (par exemple, car la carte graphique ne les prend pas en charge), il est alors possible de cloner les textures "originales" et de générer différentes versions avec les modifications de couleur pré-appliquées.
Idéalement, j'aimerais utiliser un shader, car il semble simple et nécessite peu de travail supplémentaire par rapport à la méthode de duplication de texture. Je crains que la duplication de textures juste pour changer une couleur en elles gaspille de la VRAM - ne devrais-je pas m'en inquiéter?
Edit : J'ai fini par utiliser la technique de la réponse acceptée et voici mon shader pour référence.
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;
}
Les deux textures sont 32 bits, une texture est utilisée comme table de correspondance contenant plusieurs palettes de la même taille (dans mon cas, 6 couleurs). J'utilise le canal rouge du pixel source comme index de la table des couleurs. Cela a fonctionné comme un charme pour réaliser la permutation de palette à la Megaman!