Аппаратное ускорение рендеринга текста Unicode

Я хочу написать средство визуализации текста с аппаратным ускорением, используя Free Type 2 для загрузки шрифтов, поиска правильных глифов, их размеров и т. д.

Мой план сделать это состоит в том, чтобы иметь большую текстуру, содержащую глифы (для заданного шрифта, размера и т. д.) в видеопамяти, и таблицу для каждой текстуры, определяющую информацию о содержимом текстуры в системной памяти.

Затем я могу использовать таблицу для создания буфера вершин для рендеринга текста.

Проблема, с которой я столкнулся, заключается в построении текстуры. Нецелесообразно создавать текстуру для каждого глифа в Unicode, их слишком много. Для Ascii в прошлом я просто создавал текстуру в графическом редакторе, а затем сам заранее заполнял таблицу по мере необходимости, однако для этого мне понадобится какая-то динамическая система, которая будет получать необходимые глифы, а также эффективно кэшировать их для избегайте повторных загрузок одного и того же глифа в vram... (какая-то наименее часто используемая система, я думаю)

Другая проблема заключается в том, что не все глифы имеют одинаковый размер, я мог бы разделить текстуру на сетку, достаточно большую для самых больших глифов (что мне нужно как-то точно обработать), что упрощает размещение глифов на текстуре и замену их на новые глифы (на основе наименее часто используемых или что-то в этом роде), однако это оставляет много потраченного впустую места, но я не уверен, как более эффективно их упаковать, не сталкиваясь с проблемами фрагментации, когда глифы меняются местами...

Также я предполагаю, что обновление текстуры может привести к остановке графического оборудования, если текстура все еще используется для некоторого предыдущего текста, правильно ли это предположение и как я могу избежать этого, если это так?


person Fire Lancer    schedule 27.07.2009    source источник


Ответы (2)


Рендеринг текста - это намного сложная задача, чем "вставка" некоторых глифов... Не просто сложная, а очень сложная: кернинг, лигатуры, интервалы, двунаправленный текст, гласные и многое другое...

Почему бы вам просто не создать текст, используя обычные библиотеки для рендеринга текста, такие как Pango, создать растровое изображение и отобразить его как растровое изображение на вашем 3D-объекте (если я понимаю, что вам нужно).

EDIT: Простая HTML-разметка также может отображаться с помощью Pango: http://library.gnome.org/devel/pango/unstable/PangoMarkupFormat.html

person Artyom    schedule 27.07.2009
comment
Потому что я не нашел ничего, способного отображать форматированный текст (например, какой-то простой материал типа html), и никто не указал мне на что-либо, что я мог бы интегрировать с приложением d3d в моем другом вопросе. Хотя Pango выглядит так, как будто он может делать такие вещи, добавьте его в качестве ответа на мой предыдущий вопрос (stackoverflow.com/questions/1150289/), и если после того, как я посмотрю на него позже, он сможет делать то, что мне нужно, я не приму его. - person Fire Lancer; 27.07.2009
comment
Добавлен комментарий с лайками для форматированного текста - person Artyom; 27.07.2009

Cairo поддерживает аппаратное ускорение рендеринга на множество типов поверхностей

Существует библиотека под названием FontForge, которая использует Cairo для рендеринга, но я сам ее не пробовал. Вы должны проверить это и сообщить мне, как это происходит :-)

person lurscher    schedule 26.07.2011