Bob's answer est correct de changer le mode de filtrage à TextureFilter.Point
pour garder les choses bien et pixélisé.
Mais peut-être une meilleure méthode que l'échelle de chaque sprite (comme vous auriez aussi à l'échelle de la position de chaque sprite) est de passer juste une matrice à SpriteBatch.Begin
, comme ceci:
sb.Begin(/* first three parameters */, Matrix.CreateScale(4f));
qui donnera vous la mise à l'échelle que vous voulez sans avoir à modifier tous vos appels de tirage.
Cependant, si vous utilisez des décalages à virgule flottante dans votre jeu, vous finirez avec des éléments qui ne sont pas alignés sur les limites des pixels après l'agrandissement (avec l'une ou l'autre méthode).
Il y a deux solutions à cela. La première est d'avoir une fonction comme ceci:
public static Vector2 Floor(Vector2 v)
{
return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y));
}
Et passer votre position grâce à cette fonction chaque fois que vous dessinez une image-objet. Bien que cela puisse ne pas fonctionner si vos sprites utilisent des rotations ou des décalages. Et encore une fois, vous serez de retour à modifier chaque appel de tirage. La manière «correcte» de faire cela, si vous voulez une mise à l'échelle de votre scène entière par points, est de dessiner votre scène à une cible de rendu à la taille d'origine. Puis dessinez votre cible de rendu à l'écran, mise à l'échelle (avec TextureFilter.Point
). La fonction que vous voulez regarder est GraphicsDevice.SetRenderTarget
. This MSDN article pourrait être utile de lire. Si vous êtes sur ou passer à XNA 4.0, this might be worth reading.
Je n'ai pas pu trouver un échantillon XNA plus simple pour cela rapidement, mais l'exemple Bloom Postprocess utilise une cible de rendu à laquelle il applique ensuite un shader de flou. Vous pouvez simplement ignorer complètement le shader et simplement faire le scale-up.
Quelle est la question? Comment améliorer une image? Ou comment implémenter un effet "pixelate"? – Gobra