【问题标题】:android & libgdx - disable blurry renderingandroid & libgdx - 禁用模糊渲染
【发布时间】:2012-04-08 12:23:30
【问题描述】:

我正在尝试将 libgdx 作为 opengl 包装器,但它的图形渲染存在一些问题: 出于某种原因,使用 libgdx 时,android 设备上的所有图像(纹理)看起来都有些模糊。这也包括文本(字体)。

对于 text ,我认为这是因为我使用 bitmap-fonts ,但我找不到替代方案 - 我发现有一个名为 "gdx-stb-truetype" 的库,但我不能找到如何下载和使用它。

对于普通图像,即使我在没有任何缩放的情况下显示整个图像,我希望它看起来和我在计算机屏幕上看到的一样清晰,特别是如果我在设备上有这么好的屏幕(它是银河系) . 我试图通过使用下一个代码来关闭抗锯齿:

final AndroidApplicationConfiguration androidApplicationConfiguration=new AndroidApplicationConfiguration();
androidApplicationConfiguration.numSamples=0; //tried the value of 1 too.
...

我也尝试将缩放方法设置为各种方法,但没有运气。示例:

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

作为测试,我发现了与设备上看到的分辨率完全相同的清晰图像(galaxy nexus 为 720x1184,因为按钮栏),我已将其放在背景上libgdx 应用程序的。当然,我必须添加额外的空白空间才能加载纹理,所以图像的最终尺寸(包括内容和空白空间)仍然是宽度和高度的 2 的幂(在此为 1024x2048案子) 。 在桌面应用程序上,它看起来不错。在设备上,它看起来很模糊。

我注意到的一件奇怪的事情是,当我改变设备的方向(水平 垂直)时,在旋转动画开始之前的很短的时间内,我可以很好地看到图像和文本。

当然 libgdx 可以处理这个问题,因为 android 的 api-tests 项目的 opengl 部分可以很好地显示图像。

谁能帮帮我?

@user1130529:我确实使用 spritebatch。另外,这就是我设置视口的方法。无论我是否选择保持纵横比都会发生这种情况。

public static final int          VIRTUAL_WIDTH         =720;
public static final int          VIRTUAL_HEIGHT        =1280-96;
private static final float       ASPECT_RATIO          =(float)VIRTUAL_WIDTH/(float)VIRTUAL_HEIGHT;
...
@Override
public void resize(final int width,final int height)
  {
  // calculate new viewport
  if(!KEEP_ASPECT_RATIO)
    {
    _viewport=new Rectangle(0,0,Gdx.app.getGraphics().getWidth(),Gdx.app.getGraphics().getHeight());
    Gdx.app.log("DEBUG","size:"+_viewport);
    return;
    }
  final float currentAspectRatio=(float)width/(float)height;
  float scale=1f;
  final Vector2 crop=new Vector2(0f,0f);
  if(currentAspectRatio>ASPECT_RATIO)
    {
    scale=(float)height/(float)VIRTUAL_HEIGHT;
    crop.x=(width-VIRTUAL_WIDTH*scale)/2f;
    }
  else if(currentAspectRatio<ASPECT_RATIO)
    {
    scale=(float)width/(float)VIRTUAL_WIDTH;
    crop.y=(height-VIRTUAL_HEIGHT*scale)/2f;
    }
  else scale=(float)width/(float)VIRTUAL_WIDTH;
  final float w=VIRTUAL_WIDTH*scale;
  final float h=VIRTUAL_HEIGHT*scale;
  _viewport=new Rectangle(crop.x,crop.y,w,h);
  Gdx.app.log("DEBUG","viewport:"+_viewport+" originalSize:"+VIRTUAL_WIDTH+","+VIRTUAL_HEIGHT+" aspectRatio:"+ASPECT_RATIO+" currentAspectRatio:"+currentAspectRatio);
  }

【问题讨论】:

  • 您确定需要减去 96 个像素吗?即,GDX 类报告的宽度/高度是返回 1280x720 还是分别返回 1184x720 和 1280x624?
  • @tencent:我这样做是因为galaxy nexus的真实分辨率不是1280——系统栏占用96像素,用户触摸时无法隐藏。
  • :点头:我认为这就是你这样做的原因。我只是觉得奇怪的是它会报告您无法使用的像素。如果他们改变了条的大小,它可能会完全破坏您的手动 96 条目,除非在 3.0 中他们添加了一种获取参数的方法?我非常不愿意硬编码这样的值。
  • 现在没关系了。问题是不同的 - 无论我使用什么目标分辨率,无论我使用什么大小的图像(即使是与目标分辨率相同大小的图像),图像和字体都会变得模糊。
  • 我相信这概述了您针对不同问题的相同问题。 stackoverflow.com/questions/9198932/…

标签: android fonts textures libgdx blurry


【解决方案1】:

试试这个:

TextureRegion.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);

【讨论】:

  • 希望这能行得通,但我也试过了。它也会使图像模糊。你可以试一试——在互联网上找到一张清晰的图片,它的内容大小正是你的设备分辨率之一。在应用程序上显示图像并捕获图像。比较原始图像和设备上的图像。它们看起来不同。我也试过 TextureFilter.Nearest ,但看起来像素化了。
  • 不起作用。虽然它不会伤害任何东西,但它也无济于事。
【解决方案2】:

尝试以下方法:

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

TextureFilter 有多种类型。我假设线性的(是默认的吗?)是模糊的。

【讨论】:

    【解决方案3】:

    如果您有 Chainfire 3D 应用程序或其他减少纹理或将其更改为 16 位的应用程序,请将其关闭;这对我有用,我也遇到了同样的问题。

    【讨论】:

    • 这篇文章很老了,我想我没有用过你所说的。
    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2016-06-22
    • 2015-07-04
    • 2023-03-20
    • 1970-01-01
    • 2017-03-23
    • 2015-12-29
    相关资源
    最近更新 更多