Артефакты рендеринга BitmapFont
У меня есть настройки масштабирования графического интерфейса, чтобы занять весь экран (окно). Управляющие виджеты в порядке, но масштабирование шрифтов ужасно - есть артефакты от соседних глифов (из-за некоторых ошибок округления, я полагаю).
Вы можете довольно ясно видеть это на правой стороне T:
Я попытался установить различные значения в области отступов в Hiero, но все эти значения влияют на способ отображения шрифта - они добавляют пространство между символами при рендеринге, а не только в текстуру, как я хотел.
Есть идеи, как исправить эти артефакты? Я не хочу динамического генерирования шрифтов или нескольких шрифтов, я хочу обычное масштабирование ближайшего соседа (я собираюсь для пиксельного взгляда). Я предполагаю, что это ошибка в libGDX 1.2.0.
2 ответа
После некоторого возни я понял, что нужно взломать, чтобы это заработало.
Суть: сжать все глифы, чтобы они не перекрывались.
Мое решение в Scala:
def fixFonts(fontsMap: ObjectMap[String, BitmapFont]) {
def fixFont(font: BitmapFont) {
for {
glyphPage <- font.getData.glyphs.toSeq.filter(_ != null)
glyph <- glyphPage.toSeq.filter(_ != null)
} {
glyph.u2 -= 0.001f
}
}
fontsMap.iterator().asInstanceOf[java.util.Iterator[Entry[String, BitmapFont]]].
asScala.foreach { e => fixFont(e.value)}
}
def load() {
skin = manager.get(SKIN_FILE)
fixFonts(skin.getAll(classOf[BitmapFont]))
}
РЕДАКТИРОВАТЬ (6. 4. 2015): обновлен код для работы в Scala 2.11.4
а также LibGDX 1.5.3
,
Я настроил решение monnef выше для использования Java следующим образом:
public static void fixFont(BitmapFont font) {
for (Glyph[] page : font.getData().glyphs) {
if (page == null) {
continue;
}
for (Glyph glyph : page) {
if (glyph == null) {
continue;
}
glyph.u2 -= 0.001f;
glyph.v2 -= 0.001f;
}
}
}
Обратите внимание, что дополнительно настроен и glyph.v2, без этого у меня все еще есть артефакты.
Примечание. Это обходной путь, который, вероятно, следует исправить, отредактировав шрифт.