如何缩放屏幕像素?

时间:2010-07-19 17:46:31

标签: xna 2d sprite

我编写了一个2D Jump& Run Engine,产生了320x224(320x240)的图像。为了保持旧学校“像素化” - 感觉它,我想根据用户的分辨率将得到的图像缩放2或3或4。

我不想缩放每一个精灵,而是生成的图像!

提前致谢:)

3 个答案:

答案 0 :(得分:4)

Bob's answer关于将过滤模式更改为TextureFilter.Point以保持良好和像素化是正确的。

但是可能比缩放每个精灵更好的方法(因为你还需要缩放每个精灵的位置)就是将矩阵传递给SpriteBatch.Begin,如下所示:

sb.Begin(/* first three parameters */, Matrix.CreateScale(4f));

这将为您提供所需的缩放,而无需修改所有绘制调用。

但是值得注意的是,如果你在游戏中使用浮点偏移,那么在放大后(使用任一方法),你最终都会得到与像素边界不对齐的东西。

这有两个解决方案。第一个是拥有这样的功能:

public static Vector2 Floor(Vector2 v)
{
    return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y));
}

每次绘制精灵时,都会通过该函数传递你的位置。虽然如果你的精灵使用任何旋转或偏移,这可能不起作用。再次,你将回到修改每一个绘制调用。

执行此操作的“正确”方法,如果您想要对整个场景进行简单的逐点放大,就是将场景绘制为原始大小的渲染目标。然后将渲染目标绘制到屏幕,按比例放大(使用TextureFilter.Point)。

您要查看的功能是GraphicsDevice.SetRenderTargetThis MSDN article可能值得一读。如果您正在使用或转移到XNA 4.0,this might be worth reading

我无法快速找到更简单的XNA示例,但Bloom Postprocess示例使用渲染目标,然后应用模糊着色器。您可以完全忽略着色器,只需进行放大。

答案 1 :(得分:3)

您可以使用像素化效果。绘制到RenderTarget2D,然后使用像素着色器将结果绘制到屏幕。有一个名为Shazzam Shader Editor的工具让你尝试像素着色器,它包含一个像素化的工具: http://shazzam-tool.com/

这可能不是你想要的,但它可能适合于允许高分辨率模式并且无论使用什么分辨率都具有相同的效果...... Before

After

答案 2 :(得分:1)

我不确定你的意思是“导致......一个图像”,但如果你的意思是你的最终结果是一个纹理,那么你可以将它画到屏幕上并设置一个比例:

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

只需用您想要的数字(2,3或4)替换刻度。我做了类似的事情,但每个精灵的比例,而不是结果图像。如果你的意思是别的,请告诉我,我会尽力帮助。

XNA默认为缩放图像的抗锯齿。如果你想保留像素化的优点,你需要在立即排序模式下绘制并设置一些额外的参数:

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;

它是Point或None TextureFilter。我在工作,所以我想要记住我的头脑。我今天晚些时候会以某种方式确认。

相关问题