【问题标题】:Pixelated texture filtering distorted像素化纹理过滤失真
【发布时间】:2015-06-05 21:18:23
【问题描述】:

我在 Libgdx 中创建了一个基于等距图块的游戏。我使用的纹理是 64x64 并使用 TexturePacker 打包到 TextureAtlas 中。然后将它们绘制到屏幕上。然而,在 64x64 纹理的像素化边缘移动时,它们会闪烁并且扭曲,如下图所示。我已经使用了纹理打包器中所有可用的过滤器,您可以在下面看到线性和最近过滤器的结果。除了闪烁之外,线性滤镜还为纹理添加了黑色轮廓。如果不是因为相机移动时闪烁,我会很好。

图块应如何显示:

线性过滤(可以清晰看到黑线扭曲):

最近过滤(更难看到,但像素化线不直):

最容易发现它的地方是棕色立方体的顶部和底部。失真发生在不同的地方,具体取决于相机的移动(这会导致闪烁)。

有人知道是什么原因造成的,或者有可能的解决方案吗?我不确定是否需要任何代码 sn-ps。

还值得一提的是,相机设置为 windowHeight/ppm (ppm = 64) 和 windowWidth/ppm,然后将纹理绘制到投影矩阵设置为 camera.combined 的批次上。

编辑:以某种方式将窗口高度从 800 降低到 710(最近)会更好:

【问题讨论】:

    标签: java libgdx filtering isometric texturepacker


    【解决方案1】:

    在 TexturePacker 中打开 premultiplyAlpha 选项并在 SpriteBatch 上设置 setBlendFunction.(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA)。这应该摆脱闪烁的黑边。基本上,当使用线性过滤时,当精灵的边缘与屏幕上的像素不完全对齐时,像素的颜色是从精灵边缘的图像像素和不可见黑色中的图像像素线性采样的它旁边的空间(RGBA = 0000),因此边缘可能看起来比预期的更暗和更透明。预乘 alpha 通过改变插值操作的顺序来解决这个问题。详解herehere

    另外,使用filterMinMipMapLinearNearestMipMapLinearLinear 以确保您没有得到缩小的工件。 (第一个效果更好,第二个在某些缩放级别下看起来更好,应该在您的相机放大和缩小时使用。)

    最后,filterMax 应该是 Linear

    如果精灵没有按照其原始大小的 1X、2X、3X 等精确地绘制,则最近过滤总是会产生不均匀的伪影,因为在屏幕的某些行和列中会绘制图像中的像素两次。

    【讨论】:

    • 工作就像一个魅力!非常感谢你
    • 当相机移动时,我只是在瓷砖的侧面有一些拉伸,我已经完成了你所说的一切(测试了两个过滤器)。它肯定有所改善,但摆脱所有失真会很好。这是现在的样子:imgur.com/a/xcNiv
    • 对不起,我无法从图片中分辨出失真的位置。你的最大过滤器只是线性的,对吧?
    • 是的,只是线性的。它在每个街区的右侧
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多