Estoy trabajando en un juego similar a Megaman donde necesito cambiar el color de ciertos píxeles en tiempo de ejecución. Como referencia : en Megaman cuando cambias tu arma seleccionada, la paleta del personaje principal cambia para reflejar el arma seleccionada. No todos los colores del sprite cambian, solo algunos cambian .
Este tipo de efecto era común y bastante fácil de hacer en el NES ya que el programador tenía acceso a la paleta y al mapeo lógico entre píxeles e índices de paleta. Sin embargo, en el hardware moderno, esto es un poco más desafiante porque el concepto de paletas no es el mismo.
Todas mis texturas son de 32 bits y no usan paletas.
Hay dos maneras que conozco para lograr el efecto que quiero, pero tengo curiosidad por saber si hay mejores maneras de lograr este efecto fácilmente. Las dos opciones que conozco son:
- Use un sombreador y escriba GLSL para realizar el comportamiento de "intercambio de paleta".
- Si los sombreadores no están disponibles (por ejemplo, porque la tarjeta gráfica no los admite), entonces es posible clonar las texturas "originales" y generar diferentes versiones con los cambios de color aplicados previamente.
Idealmente, me gustaría usar un sombreador, ya que parece sencillo y requiere poco trabajo adicional en oposición al método de textura duplicada. Me preocupa que duplicar texturas solo para cambiar un color en ellas está desperdiciando VRAM, ¿no debería preocuparme por eso?
Editar : Terminé usando la técnica de respuesta aceptada y aquí está mi sombreador para referencia.
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;
}
Ambas texturas son de 32 bits, una textura se usa como tabla de búsqueda que contiene varias paletas que son todas del mismo tamaño (en mi caso, 6 colores). Utilizo el canal rojo del píxel de origen como índice de la tabla de colores. ¡Esto funcionó a las mil maravillas para lograr el intercambio de paletas como Megaman!