Артефакты рендеринга 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, без этого у меня все еще есть артефакты.

Примечание. Это обходной путь, который, вероятно, следует исправить, отредактировав шрифт.

Другие вопросы по тегам