使用PointClamp或PointWrap时奇怪的纹理转移错误

时间:2013-08-20 09:16:48

标签: c# floating-point xna textures monogame

我正在制作一个小型RPG游戏,我目前正在进行窗口渲染(比如库存/任务窗口)。

我用“皮肤”,4个角,4个边框和中间的9个四边形绘制实际窗口。

问题是,在任意坐标处,三角形或两个稍微向下移动。 它始终如一地发生,并且只有在使用PointClamp或PointWrap时才会发生。其他的选择很好,但是它们看起来很模糊。

上面的绿色条实际上发生了相同的错误,但我通过使用Linear而不是Point来“修复”它。

我使用此功能将像素坐标转换为屏幕坐标:

注意:此功能与我最初在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);
    }

有关该主题的更多信息:

Directly Mapping Texels to Pixels (Direct3D 9)

Understanding Half-Pixel and Half-Texel Offsets

这个问题现在显然得到了解决,但我希望我的发现可以帮助那些陷入同样情况的人。

1 个答案:

答案 0 :(得分: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中使用这些偏移,因为它会以某种方式处理内部事务。