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.
la source
SpriteBatch
me oblige à utiliser le mode immédiat, donc ça ne vaut pas la peine. J'irai avec ça :)Réponses:
Vous devez appliquer votre shader APRÈS que votre sprite a été tourné.
Si la scène entière n'a pas encore été ombrée et que vos sprites sont réellement pixélisés, ce dont vous avez besoin est une sorte de filtre post-FX pour toute votre scène. La moyenne des régions de pixels fonctionnera correctement. Ce n'est pas exactement ce que vous avez l'intention (cela semblera un peu tordu lors du déplacement / rotation), mais cela pourrait faire l'affaire.
La seule façon de garder ce look rétro fidèle à ce que vous voulez est de dessiner vous-même vos rotations de sprites. Cela n'a rien à voir avec la façon dont la mise à l'échelle a été mise en œuvre: la résolution était en fait médiocre, en parlant de cela, avez-vous essayé avec des résolutions extrêmement basses? Cela pourrait aussi faire l'affaire et sembler plus naturel car, bien, c'est en fait ce qui a causé l'effet que vous recherchez. Et c'est pas cher! Vraiment pas cher! En fait, ce sera moins cher que ce que vous avez déjà (moins d'exécutions de shaders de fragments.)
L'effet est ruiné dans votre exemple d'image car votre résolution est élevée par rapport à vos sprites, ce qui vous permet de voir les vrais pixels de la scène.
la source
SpriteBatch
par défaut de XNA avec l'échantillonnage de points activé. Mais un post-fx pourrait vraiment fonctionner. Pour commencer, j'essaierai d'effectuer un rendu avec échantillonnage linéaire sur une cible de rendu, puis de rendre l'intégralité de la cible de rendu sur le backbuffer avec un échantillonnage ponctuel.