我正在制作一款小型 RPG 游戏,目前正在进行窗口渲染(例如库存/任务窗口)。
我用“皮肤”、4 个角、4 个边框和中间的纹理绘制了 9 个四边形的实际窗口。
问题是,在任意坐标处,一个或两个三角形会稍微向下移动。它始终如一地发生,并且只有在使用 PointClamp 或 PointWrap 时才会发生。其他选项效果很好,但看起来很模糊。
上面的绿色条实际上发生了同样的错误,但是我通过使用线性而不是点来“修复”它。
我使用此函数将像素坐标转换为屏幕坐标:
注意:这个功能和我最初在 MonoGame 中预期的一样工作。
public static Vector3 PixelToScreen(GraphicsDevice device, float X, float Y)
{
float xscale = (float)device.Viewport.Width / 2;
float yscale = (float)device.Viewport.Height / 2;
return new Vector3(((int)X / xscale) - 1f, 1f - ((int)Y / yscale), 0);
}
我怀疑这个功能可能是我问题的根源。有没有“正确的方法”来做到这一点?
一张图值一千字,所以这里有一个问题的截图。
http://i.stack.imgur.com/rNsnH.png
我很确定解决方案是微不足道的,但我无法理解。
更新
经过更多的挖掘和研究,我终于找到了解决方案。事实证明,这与纹理像素如何映射到屏幕像素有关。
更新#2
将此代码移植到 MonoGame 后,我注意到一个不同的错误,即一切看起来“模糊”。奇怪的是,删除偏移量(恢复到原始函数)解决了这个问题!
修复
public static Vector3 PixelToScreen(GraphicsDevice device, float X, float Y)
{
X -= 0.5f; // Offset the "pixel value" by half a pixel
Y -= 0.5f; // To provide "expected results" use negative value
float xscale = (float)device.Viewport.Width / 2;
float yscale = (float)device.Viewport.Height / 2;
return new Vector3((X / xscale) - 1f, 1f - (Y / yscale), 0);
}
有关该主题的更多信息:
这个问题现在显然已经解决了,但我希望我的发现能帮助陷入同样情况的人。