LibGDX FreeType字体模糊问题

6
我正在使用屏幕高度百分比和设定的百分比(未来显然会乘以密度)动态生成字体。
一些注意点: 我从OTF文件中读取。 使用最新版本的LibGDX (版本1.2.0)。
我有以下问题:字体在中等大小时出现大的断裂并且看起来很模糊,但是小号和大号都看起来非常清晰。
我的预设字体大小:
//Font sizes, small, med, large as a percentage of the screen.
    public static float
            FONT_SIZE_LARGE = 0.175f,
            FONT_SIZE_MEDIUM = 0.06f,
            FONT_SIZE_SMALL = 0.04f;

我的字体生成器设置

FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
        FreeTypeFontGenerator generator;
this.generator = new FreeTypeFontGenerator(Gdx.files.internal(filename));

生成实际字体:

//Create a new font and add it to available font sizes.
public BitmapFont createFont(float size, float color)
{
    this.parameter.size = Math.round(size);
    BitmapFont bitmapFont = generator.generateFont(parameter);
    bitmapFont.setColor(color);
    listOfFonts.add(new FontStorage(bitmapFont, size));
    return bitmapFont;
}

我已经在不同的设备上尝试了几种方法,但仍然存在相同的问题。我认为这可能是因为它不是2的幂次方?(字体需要是2的幂次方才能均匀吗?)

这些字体会在许多不同的屏幕分辨率上绘制,因此制作三种特定大小的位图字体是不可行的。

有人可以帮我解决这个问题吗?


如果在不同的大小中使用单个BitmapFont,则需要对其使用mipmapping才能使其在所有大小下看起来良好。并且可能需要使用MipMapLinearLinear作为minFactor。 - Tenfour04
我正在使用多个位图字体大小来精确匹配屏幕分辨率,但您能否提供链接或解释一下? - Oliver Dixon
哦,抱歉,我误解了你的操作。按照你的方式,Mipmapping是不必要的。我认为二次幂也不是你的问题所在。据我所知,非POT只会使性能变慢(如果你使用旧版本的libgdx并且使用OpenGL ES 1.0/1.1,则可能会出现纯黑色纹理在某些设备上)。我没有经常使用字体生成器,所以我不知道还有什么建议。 - Tenfour04
1
我正在使用最新版本,完全不知道为什么它会这样做,如果它完全匹配res的话。如果您愿意,我可以发送给您整个源代码? - Oliver Dixon
我建议去libgdx.com论坛。你很可能会在那里找到知道答案的人。我一点也不知道是什么原因导致了这个问题,所以我和你一样迷失了。 - Tenfour04
1个回答

3

我知道了,如果你想要最清晰的字体,你需要设置3个选项。

前两个选项是在从文件中创建之前(可以是OTF或TTF),它们分别是:

//Make sure you ceil for your current resolution otherwise you'll be nasty cut-offs.
this.parameter.size = (int)Math.ceil(size);
this.generator.scaleForPixelHeight((int)Math.ceil(size));

下一步是设定放大和缩小的过滤器。(如果您想要进行缩放,我不需要这样做,因为我几乎画出完美的像素)。无论如何,以下是代码:
this.generator = new FreeTypeFontGenerator(Gdx.files.internal(filename));
this.parameter.minFilter = Texture.TextureFilter.Nearest;
this.parameter.magFilter = Texture.TextureFilter.MipMapLinearNearest;

这将使您在任何分辨率下都能获得非常清晰的字体。祝好运。

我不能再拖延一天了。 - Oliver Dixon
如果我错了,请纠正我,我听说在放大时设置mipmapping没有用。 mipmapping仅适用于缩小。 - Neerkoli

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