【问题标题】:libGDX antialiasing on desktop seems uneffective桌面上的 libGDX 抗锯齿似乎无效
【发布时间】:2016-09-22 03:46:57
【问题描述】:

我正在使用 libGDX 开发桌面游戏。我想减少锯齿,这很强大。

有关于此的文档。魔法应该发生在 DesktopLauncher 类中,config.samples = samplingNumber;

我尝试了 2、4、8 和 16 个采样数。我看不出有什么不同。

这是我的 DesktopLauncher 类。

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        config.title = "AA Test";
        config.width = 1280;
        config.height = 720;
        config.samples = 8;
        new LwjglApplication(new MyGdxGame(), config);
    }
}

这是一张显示无 AA 和 MSAA 16x 之间差异的图像。对于 MSAA 2x、4x 和 8x,观察到相同的结果。

我是否缺少将 MSAA 应用于我的 libGDX 项目的内容?

【问题讨论】:

  • 如何生成这个对象?它是实际的“对象”还是您加载的图像?
  • 这是一张图片,包装在纹理图集中。我也使用线性滤波器。我实际上尝试了任何类型的过滤器,尝试了 Mipmap ......没有改变任何东西。但是混叠问题不应该与过滤器有关。
  • 正如我在 JavaGaming 论坛中看到的,AA 不会影响图像/纹理。
  • 您是如何生成 TextureAtlas 的?您尝试了哪种 MipMap 过滤器?
  • 我使用 libGDX 纹理打包器生成 TextureAtlas。我尝试了纹理打包器提出的每个 MipMap 过滤器。在这个示例中,我使用了 MipMapLinearNearest,这是我在项目中经常使用的过滤器。

标签: java graphics libgdx antialiasing


【解决方案1】:

我找到了解决这个问题的方法。

texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 

如您所见,采样场没有任何效果,但在纹理上设置此过滤器有效果。

如果您使用的是 TextureAtlas,那么您可以对 TextureAtlas 对象执行以下操作。

atlas.getTextures().forEach(t -> t.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear));

【讨论】:

  • 我在贴花内使用纹理,但无法使用它
【解决方案2】:

MSAA 仅影响多边形的边缘,这些边缘通常在 2D 场景中不可见,因为精灵通常不会一直流血到其矩形边缘。 (不透明的矩形精灵和使用 ShapeRenderer 绘制的形状除外。)

在我看来,您的图像质量就像您没有使用 mip 映射过滤器一样。使用 useMipMaps 参数 true 加载纹理,并使用 MipMapLinearLinear 或 MipMapLinearNearest 的最小过滤器(第一个看起来更好,成本更高)。注意:如果您没有使用useMipMaps true 加载纹理,则 MipMap 过滤器不会执行任何操作。

有 AA 技术可以处理屏幕的所有像素,但它们比简单地使用 mip 映射和三线性过滤更昂贵。一个例子是 FXAA,它不是通过配置设置完成的,而是通过将场景绘制到帧缓冲区对象,然后使用特殊着色器将 FBO 的纹理绘制到屏幕上。

【讨论】:

  • 是的,我总是使用 MipMap 过滤器。我在上面的例子中使用了 MipMapLinearNearest。我必须准确地说图像是移动的。在屏幕截图中,它们被旋转。正常图像是完全垂直的,但在旋转过程中会出现很多锯齿。这不是 MipMap 过滤器可以解决的问题。我想我会尝试在高分辨率 FBO 中绘制我的屏幕,生成纹理的 MipMap 并缩小到屏幕分辨率。
  • 纹理过滤器是纹理像素的采样和插值方式,因此它们绝对决定了精灵中像素的外观。你确定你的纹理已经生成了 mip 贴图吗?如果您在没有加载所有 mip 级别的纹理上使用 mip 贴图过滤器,那么它仍然不是 mip 映射。在某些情况下,由于过度下采样,这会导致混叠。放纵我并尝试 MipMapLinearLinear。
  • 顺便说一下,你描述的叫做SSAA,它比FXAA贵得多,只是略有改善。
【解决方案3】:

您的 GPU 芯片不支持 MSAA,但它应该支持 CSAA

要让它工作,你需要更换

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT | (Gdx.graphics.getBufferFormat().coverageSampling?GL20.GL_COVERAGE_BUFFER_BIT_NV:0));

在您的 render 方法中。然后将config.samples 用于桌面或config.numSamples 用于Android 设置为所需的值。

阅读更多关于 LibGDX AA here

【讨论】:

  • 是的,该页面是我为解决我的 MSAA 问题而咨询的页面之一。 CSAA 也没有工作。我想这是因为,正如 Andreas Brunnet 在我的帖子的评论中指出的那样,AA 不会影响纹理。
猜你喜欢
  • 2016-06-28
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多