1

我正在制作一款小型 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);
    }

有关该主题的更多信息:

将纹素直接映射到像素 (Direct3D 9)

了解半像素和半纹素偏移

这个问题现在显然已经解决了,但我希望我的发现能帮助陷入同样情况的人。

4

1 回答 1

0

修复

 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);
    }

不要在 MonoGame 中使用这些偏移量,因为它会以某种方式在内部处理这些问题。

于 2013-08-21T10:37:42.617 回答