【发布时间】:2010-07-19 17:46:31
【问题描述】:
我编写了一个 2D Jump&Run 引擎,生成了一个 320x224 (320x240) 的图像。为了保持老派的“像素”感觉,我想根据用户的分辨率将生成的图像缩放 2 或 3 或 4。
我不想缩放每个精灵,而是缩放生成的图像!
提前致谢:)
【问题讨论】:
-
问题是什么?如何放大图像?或者如何实现“像素化”效果?
我编写了一个 2D Jump&Run 引擎,生成了一个 320x224 (320x240) 的图像。为了保持老派的“像素”感觉,我想根据用户的分辨率将生成的图像缩放 2 或 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。 This MSDN article 可能值得一读。如果您正在使用或迁移到 XNA 4.0,this might be worth reading。
我无法快速找到更简单的 XNA 示例,但 Bloom Postprocess 示例使用渲染目标,然后应用模糊着色器。您可以完全忽略着色器并进行放大。
【讨论】:
您可以使用像素化效果。绘制到 RenderTarget2D,然后使用像素着色器将结果绘制到屏幕上。有一个名为 Shazzam Shader Editor 的工具,可以让您试用像素着色器,它包括一个进行像素化的工具: http://shazzam-tool.com/
这可能不是您想要的,但它可以很好地允许高分辨率模式并且无论使用什么分辨率都具有相同的效果......
【讨论】:
我不确定您所说的“生成...图像”是什么意思,但如果您的意思是最终结果是纹理,那么您可以将其绘制到屏幕上并设置比例:
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)。