libGDX 流畅的 FreeTypeFonts
libGDX smooth FreeTypeFonts
我在使用 libGDX 获得流畅的字体时遇到问题。我已经在这个网站和 google 上搜索过这些问题的解决方案 here and 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,我仍然得到相同的结果。好像滤镜对字体没用。
我错过了什么?
谢谢!
为了获得更好的质量,我认为您将不得不破解着色器。而且因为 libgdx.
并不难
根据我的说法,Distance field fonts 应该能为您提供最好的服务。 wiki 提供了一个关于使用它们的很好的教程。它们实际上可以显着提高字体的质量。
希望对您有所帮助。
好的,所以终于有了一个解决方案:
我只是将 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);
我在使用 libGDX 获得流畅的字体时遇到问题。我已经在这个网站和 google 上搜索过这些问题的解决方案 here and 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,我仍然得到相同的结果。好像滤镜对字体没用。
我错过了什么?
谢谢!
为了获得更好的质量,我认为您将不得不破解着色器。而且因为 libgdx.
并不难 根据我的说法,Distance field fonts 应该能为您提供最好的服务。 wiki 提供了一个关于使用它们的很好的教程。它们实际上可以显着提高字体的质量。
希望对您有所帮助。
好的,所以终于有了一个解决方案:
我只是将 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);