如何缩放屏幕像素?

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

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

提前感谢您的帮助 :)


问题是什么?如何将图像升级?还是如何实现“像素化”效果? - Gobra
3个回答

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.SetRenderTarget。阅读此MSDN文章可能会有所帮助。如果您正在使用或移动到XNA 4.0,则这篇文章可能值得一读
我找不到一个更简单的XNA示例,但Bloom Postprocess示例使用了一个渲染目标,并应用了一个模糊着色器。你可以完全忽略着色器,只进行放大处理。

3
您可以使用像素化效果。将其绘制到RenderTarget2D中,然后使用Pixel Shader将结果绘制到屏幕上。有一个名为Shazzam Shader Editor的工具,可以让您尝试像素着色器,并包括一个执行像素化的着色器: http://shazzam-tool.com/ 这可能不是您想要的,但它可能非常适合允许高分辨率模式并且无论使用什么分辨率都具有相同的效果... Before After

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。我现在正在工作,所以只能凭记忆回答。稍后我会确认一下。


根据文档,"TextureFilter.None" 只是为了禁用 "MipFilter" (只使用 MagFilter)。您可能确实希望为此效果设置 "MipFilter = TextureFilter.None" (并将其他选项保留为 "Point")。 - Andrew Russell
我刚查了一下,你要的是“点”(Point)。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接