如何缩放屏幕上的像素?

如何缩放屏幕上的像素?

问题描述:

我写了一个2D Jump &运行引擎,产生一个320x224(320x240)的图像。为了保持旧学校的“像素” - 感受到它,我想根据用户的分辨率将结果图像缩放2或3或4。如何缩放屏幕上的像素?

我不想缩放每个精灵,但是由此产生的图像!

感谢提前:)

+0

问题是什么?如何升级图像?或者如何实现“像素化”效果? – Gobra 2010-07-19 18:02:10

我不完全相信你所说的“造成...的图像”的意思,但如果你的意思是你的最终结果是纹理,那么你可以绘制到屏幕并设置一个比例尺:

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; 

它或者点或无TextureFilter。我在工作,所以我试图记住我的头顶。今天晚些时候我会确认一种方式。

+0

根据文档,'TextureFilter.None'仅仅用于'MipFilter'来禁用它(并且只使用MagFilter)。你可能*想*为此效果设置'MipFilter = TextureFilter.None'(并将其他人作为'Point')。 – 2010-07-20 04:51:40

+0

我只是看着它,它是你想要的点 – Bob 2010-07-20 14:14:50

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示例使用渲染目标,然后将模糊着色器应用于此渲染目标。您可以完全忽略着色器,只需进行放大。

您可以使用像素化效果。绘制到RenderTarget2D,然后使用Pixel Shader将结果绘制到屏幕上。有一个叫Shazzam着色器编辑器工具,它可以让你尝试了像素着色器,它包括一个没有像素结构: http://shazzam-tool.com/

这可能不是你想要的,但它可以允许高分辨率模式和好具有同样的作用,不管是用什么分辨率... Before

After