Android和Libgdx - 禁用模糊渲染

6
我正在尝试使用libgdx作为OpenGL包装器,并且在其图形渲染方面遇到了一些问题: 出于某种原因,在Android设备上使用libgdx查看所有图像(纹理)时,它们都会看起来有点模糊。这也包括文本(字体)。
对于文本,我认为这是因为我使用了位图字体,但我找不到替代品。我发现有一个名为“gdx-stb-truetype”的库,但我找不到如何下载和使用它的方法。
对于普通图像,即使我显示整个图像而没有任何缩放,我希望它看起来与我在计算机屏幕上看到的一样清晰,特别是如果设备上有如此好的屏幕(它是Galaxy Nexus)。我已经尝试关闭抗锯齿,使用以下代码:
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? - ian.shaun.thomas
@腾讯:我这样做是因为Galaxy Nexus的实际分辨率不是1280,系统栏占用了96个像素,并且在用户触摸时无法隐藏。 - android developer
我假设这就是你这样做的原因。我只是觉得奇怪它会报告你不能使用的像素。如果他们改变了条的大小,除非在3.0中添加了一种获取参数的方式,否则它可能会彻底破坏你手动输入的96个条目?我极为不愿意硬编码这样的值。 - ian.shaun.thomas
现在不重要了。问题是不同的 - 无论我使用什么目标分辨率和图像大小(即使是与目标分辨率相同大小的图像),图像和字体都变得模糊。 - android developer
我相信这篇文章概述了您遇到的不同问题的相同问题。https://dev59.com/Umox5IYBdhLWcg3wcj94 - ian.shaun.thomas
3个回答

2

试试这个:

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

希望这能行,但我也试过了。它会使图像变得模糊。你可以试一下 - 在互联网上找到一个清晰的图像,其内容大小恰好是你设备分辨率的大小。在应用程序中显示图像并捕获图像。比较原始图像和设备上的图像。它们看起来不同。我还尝试了TextureFilter.Nearest,但那看起来很像素化。 - android developer
不起作用。虽然它不会造成任何损害,但也没有任何作用。 - Herb Meehan

1
尝试以下代码: texture.setFilter(TextureFilter.Nearest, TextureFilter.Nearest);
有几种类型的TextureFilters。我假设Linear(默认值?)会模糊图像。

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

这篇帖子很旧了,我不认为我用过你说的东西。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接