J'ai essayé de travailler sur un jeu avec l'apparence d'un jeu 8 bits utilisant XNA, en utilisant spécifiquement NES comme guide.
Le NES a une palette très spécifique et chaque sprite peut utiliser jusqu'à 4 couleurs de cette palette. Comment pourrais-je imiter cela? La façon dont j'accomplis ceci est que j'ai une texture avec des valeurs définies qui agissent comme des index d'un tableau de couleurs que je passe au GPU. J'imagine qu'il doit y avoir un meilleur moyen que cela, mais c'est peut-être le meilleur moyen?
Je ne veux pas simplement m'assurer de dessiner chaque image-objet avec les bonnes couleurs, car je veux pouvoir modifier dynamiquement la palette. Je préférerais également ne pas modifier la texture directement en utilisant le CPU.
Serait-ce trop lent pour créer une classe composite qui peut contenir jusqu'à 4 objets qui sont une de chaque couleur pour le sprite et combiner cela dans le sprite qui est dessiné. Ainsi, chaque sprite est un composite de jusqu'à 4 sprites combinés puis dessinés.
Ensuite, vous pouvez changer 1 couleur via cette classe et le sprite entier changerait.
(Remarque, je n'ai pas fait de XNA mais cela pourrait susciter des idées avec vous.)
la source
Si vous ne vous souciez pas du tout des performances de la mémoire, vous pouvez stocker vos images-objets non compressées de sorte que les pixels de couleur 0 soient du rouge pur, 1 du vert pur, 2 du bleu pur et 3 de l'alpha pur.
Au moment de rendre un sprite, définissez une constante de pixel shader de matrice composée de quatre vecteurs qui correspondent aux couleurs 0, 1, 2, 3. Dans le pixel shader, exécutez le code suivant pour recolorer le texel de sprite:
Cela fonctionne parce que lorsqu'un pixel est de couleur 0, il est rouge pur, et il finira donc par
ou
et il en va de même pour les couleurs 1, 2 et 3.
Si vous vous souciez des performances de la mémoire, stockez votre palette NES en tant que texture non compressée 256x1 RVB, définissez le filtrage de texture sur le plus proche voisin, stockez vos sprites en tant que textures monocanal 8 bits non compressées et faites du code shader quelque chose comme ceci :
la source