【问题标题】:libGDX smooth FreeTypeFontslibGDX 平滑 FreeTypeFonts
【发布时间】:2015-02-26 00:35:00
【问题描述】:

我在使用 libGDX 获得平滑字体时遇到问题。我已经在这个网站上搜索过,在谷歌上,我尝试了herehere这些问题的解决方案,但我的字体总是呈现不佳。

示例:

我尝试了几种方法,总是得到与上图描述的完全相同的结果。

我用来生成字体的一种方法是:

public static BitmapFont generateFont(String fontPath, float size){
    FileHandle fontFile = Gdx.files.internal(fontPath);
    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile);
    FreeTypeFontGenerator.FreeTypeFontParameter params = new FreeTypeFontGenerator.FreeTypeFontParameter();
    params.genMipMaps = true;
    params.magFilter = TextureFilter.MipMapLinearNearest;
    params.minFilter = TextureFilter.MipMapLinearNearest;
    params.size = (int)Math.ceil(size);
    generator.scaleForPixelHeight((int)Math.ceil(size));
    BitmapFont f = generator.generateFont(params);
    return f;
}

我尝试的另一个策略是在 AssetManager 中加载字体:

FileHandleResolver resolver = new InternalFileHandleResolver();
assetsManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
assetsManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));

FreeTypeFontLoaderParameter size4Params = new FreeTypeFontLoaderParameter();
sizeParams.fontFileName = "Fonts/GOTHIC.TTF";       
sizeParams.fontParameters.size = (int)Math.ceil(2*Gdx.graphics.getWidth()/9);
sizeParams.fontParameters.genMipMaps = true;                    
sizeParams.fontParameters.minFilter = TextureFilter.MipMapLinearNearest;
sizeParams.fontParameters.magFilter = TextureFilter.MipMapLinearNearest;                            
assetsManager.load("font1.ttf", BitmapFont.class, sizeParams);

这两种策略的结果是一样的,但最让我恼火的是,即使我去掉了“genMipMaps = true”,以及这些方法中的TextureFilters,我仍然得到相同的结果。就像过滤器对字体没用一样。

我错过了什么?

谢谢!

【问题讨论】:

  • 您的 OpenGL 视口是否与屏幕尺寸完全相同? (可能是字体很好,并且其他地方发生了缩放?)
  • 我没有触摸视口,所以默认情况下它应该与屏幕大小相同,我猜。
  • 可能是viewport的问题,我用的是FitViewport,字体一点都不流畅。如何设置视口以使字体平滑?

标签: fonts filter libgdx freetype mipmaps


【解决方案1】:

好的,所以最后这里是一个解决方案: 我只是将 TextureFilter 从 MipMapLinearNearest 更改为 Linear,并获得了平滑的纹理:

根据post,起初我非常不愿意使用线性滤镜,因为我认为它会降低帧速率。但是我没有观察到使用 FPSLogger 的任何 fps 下降,所以看起来一切都很好。

这是我使用资产管理器生成字体的最终代码:

FileHandleResolver resolver = new InternalFileHandleResolver();
assetsManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
assetsManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));

FreeTypeFontLoaderParameter size4Params = new FreeTypeFontLoaderParameter();
sizeParams.fontFileName = "Fonts/GOTHIC.TTF";       
sizeParams.fontParameters.size = (int)Math.ceil(2*Gdx.graphics.getWidth()/9);                 
sizeParams.fontParameters.minFilter = TextureFilter.Linear;
sizeParams.fontParameters.magFilter = TextureFilter.Linear;                            
assetsManager.load("font1.ttf", BitmapFont.class, sizeParams);

【讨论】:

  • 如果不使用 mipmap 过滤器,则不需要生成 mipmap。
【解决方案2】:

为了获得更好的质量,我认为你必须侵入着色器。并且因为有 libgdx,这并不难。

Distance field fonts 对我来说应该是最好的。 wiki 提供了一个很好的关于使用它们的教程。它们实际上可以显着提升字体质量。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答,但我不想使用着色器,因为它需要使用 spritebatch。在我的应用程序中,我正在使用舞台并在几个演员中使用字体。着色器不适合我的代码。我很确定我的代码中只缺少一点东西来使用 TextureFilters,但我无法找出它是什么。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多