Xna 如何缩放屏幕像素?

Xna 如何缩放屏幕像素?,xna,2d,sprite,Xna,2d,Sprite,我已经编写了一个2D跳转和运行引擎,生成了一个320x224(320x240)图像。为了保持旧式的“像素”感觉,我想根据用户的分辨率将生成的图像缩放2、3或4 我不想缩放每一个精灵,但最终的图像 提前感谢:)我不太清楚你所说的“生成…图像”是什么意思,但如果你的意思是最终结果是纹理,那么你可以将其绘制到屏幕上并设置比例: spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, dep

我已经编写了一个2D跳转和运行引擎,生成了一个320x224(320x240)图像。为了保持旧式的“像素”感觉,我想根据用户的分辨率将生成的图像缩放2、3或4

我不想缩放每一个精灵,但最终的图像


提前感谢:)

我不太清楚你所说的“生成…图像”是什么意思,但如果你的意思是最终结果是纹理,那么你可以将其绘制到屏幕上并设置比例:

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。我在工作,所以我试着从头开始回忆。我将在今天晚些时候进行确认。

将过滤模式更改为
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.SetRenderTarget
。也许值得一读。如果您正在使用或移动到XNA 4.0


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

您可以使用像素化效果。绘制到RenderTarget2D,然后使用像素着色器将结果绘制到屏幕。有一个名为Shazzam Shader Editor的工具,让您试用像素着色器,其中包括一个进行像素化的工具:

这可能不是您想要的,但它可能有利于允许高分辨率模式,并且无论使用何种分辨率,都具有相同的效果。。。


问题是什么?如何提升形象?或者如何实现“像素化”效果?根据文档,
TextureFilter.None
仅用于
MipFilter
禁用它(并且仅使用MagFilter)。您可能确实需要设置
MipFilter=TextureFilter.None
以实现此效果(其他设置为
Point
)。我只是查找了一下,您需要的正是Point