He estado tratando de trabajar en un juego con el aspecto de un juego de 8 bits usando XNA, específicamente usando el NES como guía.
El NES tiene una paleta muy específica y cada sprite puede usar hasta 4 colores de esa paleta. ¿Cómo podría emular esto? La forma actual de lograr esto es que tengo una textura con valores definidos que actúan como índices de una matriz de colores que paso a la GPU. Me imagino que debe haber una mejor manera que esta, pero ¿tal vez esta es la mejor manera?
No quiero simplemente asegurarme de dibujar cada sprite con los colores correctos porque quiero poder alterar dinámicamente la paleta. También preferiría no alterar la textura directamente usando la CPU.
Sería lento para crear una clase compuesta que pueda contener hasta 4 objetos que son uno de cada color para el sprite y combinarlo en el sprite que se dibuja. Entonces cada sprite es un compuesto de hasta 4 sprites combinados y luego dibujados.
Entonces podría cambiar 1 color a través de esa clase y todo el sprite cambiaría.
(nota, no he hecho XNA pero esto podría generar algunas ideas contigo).
fuente
Si no le importa en absoluto el rendimiento de la memoria, puede almacenar sus sprites sin comprimir de modo que los píxeles con el color 0 sean rojo puro, 1 sea verde puro, 2 sean azul puro y 3 sean alfa puro.
Cuando esté a punto de representar un sprite, establezca un sombreador de píxeles de matriz constante formado por cuatro vectores que correspondan a los colores 0, 1, 2, 3. En el sombreador de píxeles, ejecute el siguiente código para volver a colorear el texto del sprite:
Esto funciona porque cuando un píxel es de color 0, es de color rojo puro, por lo que terminará como
o
y lo mismo se aplica a los colores 1, 2 y 3.
Si le importa el rendimiento de la memoria, guarde su paleta NES como una textura sin comprimir RGB de 256x1, configure el filtrado de textura en el vecino más cercano, almacene sus sprites como texturas de un solo canal sin comprimir de 8 bits y haga un código de sombreador como este :
fuente