[OpenGL] Динамический вывод текста с использованием BFF(BitmapFontFile
когда мне потребовалось для андроида быстро быстро выводить много много текстов, я написал свой велосипед. он не очень то и большой вышел
я написал свой велосипед. он не очень то и большой вышелА не могли бы Вы привести тот кусочек Java-кода, в котором происходит создание текстуры (т.е. текстурного объекта OpenGL) по файлу шрифта ? (у Вас ведь используется формат TTF ?)
загрузкой ттф я не занимался, ибо не было необходимости. Т.е. я писал дефолтным. Но вроде как если она возникнет на андроиде, то это делается в две строчки по принципу ("оно само там все работает как надо")
у меня работает по такой схеме:
- берем все тексты, которые нужно вывести, генерим строчку из всех уникальных символов, которые в нем присутствуют.
- потом берем и создаем bmp-шку. тупо по канве рисуем как можно плотнее (!оставь зазор. там есть проблемы) друг за другом эти наши уникальные буковки при помощи методов по типу drawtext(x,y,string)
- когда рисуем, запоминаем куда какая буква отрисовалась и сохраняем этот мапинг. используется что то вроде fontmetrics.mesure(string)
- загружаем текстурку в опенгл
- генерим сразу для всех текстов ихние треугольнички (вершинные координаты) и текстурные координаты
- заливаем в опенггл эти два массивчика.
- "одной командой" drawelements рисуем все тексты сразу.
полный алфавит я не стал генерить, ибо побоялся чего-нибудь забыть (да мало ли чего там в текстах встретится) это раз.
текстурка у меня получается экономной (не все буквы нужны заглавными и прописными сразу) это два
можно легко поддерживать всякие там французские и прочие буковочки с крышечками и точечками над символами это три.
когда тупо по канве начинаем рисовать, в этом месте вроде можно как раз и свой кастомный шрифт подключить из ресурсов андроид-приложения
вообще нам нужно было довольно крупно рисовать. а размер текстуры сверху тоже как бы ограничен. ну и хотелось одной текстурой обойтись, без переключения между ними. иначе бы тупо не влезли бы
- потом берем и создаем bmp-шку. тупо по канве рисуем как можно плотнее (!оставь зазор. там есть проблемы) друг за другом эти наши уникальные буковки при помощи методов по типу drawtext(x,y,string)Да, спасибо за идею !
- когда рисуем, запоминаем куда какая буква отрисовалась и сохраняем этот мапинг. используется что то вроде fontmetrics.mesure(string)
- загружаем текстурку в опенгл
Рисование на канве + загрузка в текстуру — это я уже пробовал реализовывать, но Вы предложили вариант сложнее и лучше моего, но, вероятно, объемнее по коду. А мне хотелось бы более простого, прямолинейного и универсального (относительно платформ) решения.
Оставить комментарий
nikola1956
К сожалению, при использовании библиотеки OpenGL возникают сложности с динамическим выводом текста, т.е. с максимально быстрым выводом текста в режиме реального времени. Эта казалось бы тривиальная задача связана со значительными сложностями при программировании.У меня имеется уже готовый класс, который осуществляет вывод текста с использованием текстур OpenGL, но, к сожалению, этот класс использует шрифтовые файлы некоего странного формата BFF (Bitmap Font File). Возникает вопрос, как сгенерировать такие файла ? Кто-нибудь сталкивался с подобными проблемами ?
Единственная программа CBFG (Codehead's Bitmap Font Generator), которую я смог найти в инете, к сожалению, не работает (выдается ошибка Save Failed). Как вы думаете, есть ли другие программы, которые способны генерировать BFF-файлы шрифтов ? Может быть кто-нибудь из форумчан знает ?
Подскажите, пожалуйста, как лучше преодолеть возникшие трудности. Нельзя ли как-то обойти возню с OpenGL-текстурами, использовав уже готовый код ?