L'image ci-dessous montre deux sprites rendus avec un échantillonnage de points au-dessus d'un arrière-plan:
- Le crâne gauche n'a aucune rotation / mise à l'échelle qui lui est appliquée, donc chaque pixel correspond parfaitement à l'arrière-plan.
- Le crâne droit est pivoté / mis à l'échelle, ce qui entraîne des pixels plus grands qui ne sont plus alignés sur l'axe .
Comment pourrais-je développer un pixel shader qui rendrait le sprite transformé à droite avec des pixels alignés sur les axes de la même taille que le reste de la scène?
Cela pourrait être lié à la façon dont la mise à l'échelle des sprites a été mise en œuvre dans les anciens jeux tels que Monkey Island, car c'est l'effet que j'essaie d'obtenir, mais avec une rotation ajoutée.
Éditer
Conformément aux suggestions de kaoD, j'ai essayé de résoudre le problème en tant que post-processus. L'approche la plus simple consistait à effectuer d'abord le rendu sur une cible de rendu distincte (sous-échantillonnée pour correspondre à la taille de pixel souhaitée), puis à la mettre à l'échelle lors du deuxième rendu. Il a répondu à mes exigences ci-dessus.
J'ai d'abord essayé de le faire Linear -> Point
et le résultat était le suivant:
Il n'y a pas de distorsion mais le résultat semble flou et il perd la plupart des couleurs de reflets. À mon avis, cela brise le look rétro dont j'avais besoin.
La deuxième fois que j'ai essayé Point -> Point
et le résultat était le suivant:
Malgré la distorsion, je pense que cela pourrait être assez bon pour mes besoins, même si cela semble mieux en tant qu'image fixe qu'en mouvement.
Pour le démontrer, voici une vidéo de l'effet, bien que YouTube en ait filtré les pixels:
Cependant, je laisse la question ouverte pendant quelques jours de plus au cas où quelqu'un trouverait une meilleure solution d'échantillonnage qui maintiendrait l'aspect net tout en diminuant la quantité de distorsion lors du déplacement.
SpriteBatch
me oblige à utiliser le mode immédiat, donc ça ne vaut pas la peine. J'irai avec ça :)