Всем привет!
Сделал растровый шрифт для GL'я, но у него куча недостатов:
1. Надо постоянно пересоздавать меш текста и заливать его в буфер.
2. Размер буфера всегда ограничен максимальной длиной строки.
3. Текст динамически изменяется, что приводит к постоянному обновлению буфера.
В общем вопрос: можно ли рисовать/генерить треугольники в геометрическом шейдере?
... и еще куча вопросов ...
Или там тоже буфер и ограничения?
И вообще, как рисовать шрифты без ограничений по скорости?
Есть ли свободная библиотека или заголовки FreeType для Delphi?
У меня получается, что строка из 256 символов в треугольниках жрет 2,95 Мб вместе с цветом.
Если куча объекто, то видеопамять быстро кончится.
eDmk
> строка из 256 символов в треугольниках жрет 2,95 Мб
Ты где-то в 1000 раз ошибся, а так норм.
Ghost2
Без аргументов ваши подписи не интересны.
eDmk
Открой калькулятор и посчитай. 256 символов * 4 вершины * (3 координаты + 2 текстурных координаты + цвет). Если у тебя получится почти 3 мегабайта, то извини, кибернетика тут бессильна.
Ghost2
Вы не так считаете. Там размер символа 55x55 пикселей.
Это 3025 quad'ов на символ или 6050 точек на символ, т.к. квад состоит из 2-х треугольников.
6050 x 256 = 1548800 точек * 16 байт (vec4) = 24780800 или 23,6 Мб.
Да в меньшую сторону ошибся.
eDmk
> Вы не так считаете
Я как раз правильно считаю. С позиций здравого смысла.
Растровый шрифт - это когда текстуру с картинками буков натягивают с соответствующими текстурными координатами на квады. А у тебя получился майнкрафт из глифов.
Ghost2
> А у тебя получился майнкрафт из глифов
Ну да - получился меш. Вот я и спрашиваю опыта местных. Может кто делал как иначе.
Ghost2
> А у тебя получился майнкрафт из глифов.
Я плакаль :))))
eDmk
> Это 3025 quad'ов на символ
Это мега фейл! Один символ - один квад.
eDmk
> Может кто делал как иначе.
Ты смотрел уже как это стандартно делается?
Learn OpenGL. Урок 7.2 – Отрисовка текста
eDmk
> В общем вопрос: можно ли рисовать/генерить треугольники в геометрическом
> шейдере?
Можно и на ComputeShader. Скажем в альфа канал записываешь код символа. Позиция вершины будет позицией символа. Получиться вершина на символ.
eDmk
> Вот я и спрашиваю опыта местных
Опыт подсказывает, что нужно создать текстуру с символами (фритайп не нужен, достаточно стандартной WinAPI функции GetGlyphOutline), запоминая где-то их текстурные координаты и расположение относительно baseline. А потом рисовать квады, на которые натянуты кусочки подготовленной выше текстуры, по одному символу на квад.
foxes
> Это мега фейл!
Это работает! Правда тормозека сплошная :)
eDmk
> У меня получается, что строка из 256 символов в треугольниках жрет 2,95 Мб
> вместе с цветом
Сделай 2 треугольника (квад) и прицепи к ним картинку с текстом.
Imgui просто векторный шрифт перегоняется в геометрию и формирует строку из симвов в вершинном буфере. Но то также, дело вкуса
Deamon
> Imgui
у ТС GL, а Imgui требуется для работы DX (https://gamedev.ru/flame/forum/?id=250288&page=9&m=5160701#m120)
Можно использовать SDF для векторного шрифта и шейдер невероятно простой (с аутлайном и тенями), 1 квад на символ. (а лучше треугольник с discard)
https://habr.com/ru/post/215905
Хмм.. А зачем самому то делать? Я взял GDI+, вывожу им текст в битмап, а потом его копирую в текстуру. Там кода получается несколько десятков строк всего. При этом можно использовать любые шрифты винды, масштабировать их, накладывать на картинку и т.п. Единственный минус - генерацию текста нужно делать в отдельном треде, поскольку GDI делает все довольно медленно, так что бы не тормозила основной рендер. Но зато никакого геморроя.
Тема в архиве.