2010-07-19 3 views
6

J'ai écrit un moteur d'exécution 2D Jump & résultant en une image 320x224 (320x240). Pour maintenir l'ancienne école "pixely", je voudrais redimensionner l'image résultante par 2 ou 3 ou 4, selon la résolution de l'utilisateur.Comment mettre à l'échelle les pixels à l'écran?

Je ne veux pas mettre à l'échelle chaque sprite, mais l'image qui en résulte!

Merci à l'avance :)

+0

Quelle est la question? Comment améliorer une image? Ou comment implémenter un effet "pixelate"? – Gobra

Répondre

1

Je ne suis pas sûr de ce que vous entendez par « résultat ... une image », mais si vous voulez dire le résultat final est une texture, vous pouvez dessiner à l'écran que et définissez une échelle:

spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, depth); 

Remplacez simplement l'échelle par le nombre souhaité (2, 3 ou 4). Je fais quelque chose de similaire, mais l'échelle par sprite et non l'image résultante. Si tu veux dire quelque chose d'autre, fais-le moi savoir et j'essaierai de t'aider.

XNA utilise par défaut l'anticrénelage de l'image mise à l'échelle. Si vous voulez conserver la bonté pixélisé vous devez dessiner en mode de tri immédiat et définir quelques paramètres supplémentaires:

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); 
GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Point; 
GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Point; 
GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Point; 

Il est soit le point ou le Néant TextureFilter. Je suis au travail alors j'essaie de me souvenir du haut de ma tête. Je confirmerai d'une façon ou d'une autre plus tard aujourd'hui.

+0

Selon la documentation, 'TextureFilter.None' est juste pour' MipFilter' pour le désactiver (et seulement utiliser le MagFilter). Vous avez probablement * vouloir * régler 'MipFilter = TextureFilter.None' pour cet effet (et laisser les autres comme' Point'). –

+0

Je viens de le chercher et il est Point que vous voulez – Bob

4

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.

3

Vous pouvez utiliser un effet de pixellisation. Dessinez un RenderTarget2D, puis dessinez le résultat à l'écran en utilisant un Pixel Shader. Il y a un outil appelé Shazzam Shader Editor qui vous permet essayer de pixel shaders et il comprend un qui fait pixellisation: http://shazzam-tool.com/

Cela peut ne pas être ce que vous vouliez, mais il pourrait être bon pour permettre à un mode haute résolution et ayant le même effet, peu importe ce que la résolution a été utilisé ... Before

After

Questions connexes