В настоящее время я разрабатываю небольшую игру OpenGL для платформы Android, и мне интересно, есть ли простой способ визуализировать текст поверх визуализированного кадра (например, HUD со счетом игрока и т. Д.). Для текста также необходимо использовать собственный шрифт.
Я видел пример с использованием представления в качестве наложения, но не знаю, хочу ли я это сделать, так как позже я, возможно, захочу перенести игру на другие платформы.
Любые идеи?
android
opengl-es
text-rendering
shakazed
источник
источник
Ответы:
В Android SDK нет простого способа рисовать текст в представлениях OpenGL. Оставляя вам следующие варианты.
источник
Рендеринг текста в текстуру проще, чем в демонстрации Sprite Text, основная идея состоит в том, чтобы использовать класс Canvas для рендеринга в Bitmap, а затем передать Bitmap в текстуру OpenGL:
источник
Я написал учебник, который расширяет ответ, опубликованный JVitela . По сути, он использует ту же идею, но вместо рендеринга каждой строки в текстуру он отображает все символы из файла шрифта в текстуру и использует это для обеспечения полного динамического рендеринга текста без дальнейших замедлений (после завершения инициализации) ,
Основное преимущество моего метода по сравнению с различными генераторами атласов шрифтов заключается в том, что вы можете поставлять небольшие файлы шрифтов (.ttf .otf) вместе с вашим проектом, вместо того, чтобы отправлять большие растровые изображения для каждого варианта и размера шрифта. Он может генерировать шрифты идеального качества в любом разрешении, используя только файл шрифта :)
В учебник включен полный код, который можно использовать в любом проекте :)
источник
По этой ссылке:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
Вы можете визуализировать любой вид в растровое изображение. Вероятно, стоит предположить, что вы можете разметить представление по своему усмотрению (включая текст, изображения и т. Д.), А затем отобразить его в растровое изображение.
Используя приведенный выше код JVitela, вы сможете использовать это Bitmap как текстуру OpenGL.
источник
Взгляните на CBFG и порт Android для кода загрузки / рендеринга. Вы должны иметь возможность вставить код в свой проект и сразу же использовать его.
CBFG - http://www.codehead.co.uk/cbfg
Загрузчик Android - http://www.codehead.co.uk/cbfg/TexFont.java
источник
Я посмотрел на пример текста спрайта, и он выглядит ужасно сложным для такой задачи, я тоже подумал о рендеринге в текстуру, но меня беспокоит снижение производительности, которое может вызвать. Возможно, мне просто придется пойти с обзором и беспокоиться о портировании, когда придет время пересечь этот мост :)
источник
Взгляните на образец «Sprite Text» в образцах GLSurfaceView .
источник
ИМХО есть три причины использовать OpenGL ES в игре:
Рисование текста всегда является проблемой в игровом дизайне, потому что вы рисуете предметы, поэтому у вас не может быть общего вида деятельности с виджетами и так далее.
Вы можете использовать платформу для создания растровых шрифтов из шрифтов TrueType и их рендеринга. Все структуры, которые я видел, работают одинаково: генерируют координаты вершин и текстуры для текста во время рисования. Это не самое эффективное использование OpenGL.
Лучший способ - выделить удаленные буферы (объекты буфера вершин - VBO) для вершин и текстур на ранней стадии кода, избегая операций ленивого переноса памяти во время отрисовки.
Имейте в виду, что игроки не любят читать текст, поэтому вы не будете писать длинный динамически генерируемый текст. Для этикеток вы можете использовать статические текстуры, оставив динамический текст для времени и счета, и оба они числовые и состоят из нескольких символов.
Итак, мое решение простое:
Операции рисования выполняются быстро, если вы используете удаленные статические буферы.
Я создаю XML-файл с позициями экрана (на основе процента диагонали экрана) и текстурами (статическими и символами), а затем загружаю этот XML перед рендерингом.
Чтобы получить высокий FPS, вам следует избегать создания VBO во время отрисовки.
источник
Если вы настаиваете на использовании GL, вы можете визуализировать текст на текстурах. Предполагая, что большая часть HUD относительно статична, вам не нужно слишком часто загружать текстуры в память текстур.
источник
Взгляните на
CBFG
Android-порт кода загрузки / рендеринга. Вы должны иметь возможность вставить код в свой проект и сразу же использовать его.CBFG
Загрузчик Android
У меня проблемы с этой реализацией. Он отображает только один символ, когда я пытаюсь изменить размер растрового изображения шрифта (мне нужны специальные буквы), вся отрисовка не выполняется :(
источник
Я искал это в течение нескольких часов, это была первая статья, которую я нашел, и, хотя она дает лучший ответ, самые популярные ответы, я думаю, не соответствуют действительности. Конечно для того, что мне было нужно. Ответы Вайкселя и Шаказеда были прямо на кнопке, но немного скрыты в статьях. Чтобы поставить вас прямо в проект. Здесь: просто создайте новый проект Android на основе существующего образца. Выберите ApiDemos:
Посмотрите в исходную папку
ApiDemos/src/com/example/android/apis/graphics/spritetext
И вы найдете все необходимое.
источник
Для статического текста :
Для длинного текста, который необходимо время от времени обновлять:
Для числа (отформатированного 00.0):
В вашем событии onDraw обновите только переменную значения, отправленную шейдеру.
Приведенный выше код работает для атласа текстуры, где числа начинаются с 0 в 7-м столбце 2-й строки атласа шрифтов (текстуры).
Обратитесь к https://www.shadertoy.com/view/Xl23Dw для демонстрации (правда, с неправильной текстурой)
источник
В OpenGL ES 2.0 / 3.0 вы также можете комбинировать OGL View и UI-элементы Android:
Создайте макет activity_gl.xml:
Чтобы обновить элементы из потока рендеринга, можно использовать Handler / Looper.
источник