libGDX光滑字体(FreeTypeFonts)

4
我在使用libGDX时遇到了字体模糊的问题。我已经在这个网站和谷歌上搜索过了,并尝试了这里这里的解决方案,但我的字体渲染质量仍然很差。
例如: enter image description here 我尝试了几种方法,但总是得到与上面图片描述相同的结果。
其中一种我用来生成字体的方法是:
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视口与屏幕大小完全相同吗?(字体可能很好,而其他地方发生了缩放?) - P.T.
我没有触碰视口,所以默认情况下它应该与屏幕大小相同,我猜。 - vdlmrc
也许我有同样的问题是由于视口,我正在使用FitViewport,而字体根本不流畅。我该如何设置视口以使字体平滑? - JavaDev
2个回答

9

好的,最终这里有一个解决方案:

我只是将TextureFilter从MipMapLinearNearest更改为Linear,然后我获得了平滑的纹理:enter image description here

起初,我非常不愿意使用线性过滤器,因为我认为它会降低帧率,根据这篇post。但我没有观察到任何FPS下降,在FPSLogger中看起来一切都很好。

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

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);

3
如果你不使用mipmap滤波器的话,就不需要生成mipmap。 - Veljko

1
为了获得更好的质量,我认为你需要深入研究着色器。由于libgdx的存在,这并不难。
对我来说,距离场字体 应该是最适合你的选择。维基提供了一个很好的教程。它们实际上可以显著提高字体的质量。
希望这可以帮到你。

谢谢您的回答,但我不想使用着色器,因为它需要使用SpriteBatch。在我的应用程序中,我正在使用舞台并在多个演员中使用字体。该着色器无法适合我的代码。 我非常确定我的代码中只缺少一点东西就能使用TextureFilters,但我找不到它是什么。 - vdlmrc

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