Многоязычный Unicode рендеринг в opengl - PullRequest
7 голосов
/ 15 марта 2010

Мне нужно расширить систему рендеринга OpenGL для поддержки международных символов (особенно иврита, арабского и кириллицы).

Платформа разработки - Windows (XP | Vista | 7), увы, использующая Embercardero Delphi 2010.

В настоящее время я использую wglOutLineFont (...) для построения списка отображения моего шрифта и glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text) ) для рендеринга моих строк.

Хотя это возможно для символов Latin-1, создание полного набора символов Юникода заранее занимает довольно много времени (около 8,5 минут на моем компьютере), поэтому я ищу более эффективное решение. Я думал об ограничении диапазона от u + 0020 - u + 077f (латиница, греческий, кириллица, арабский и иврит), чтобы включить только те глифы, которые мне нужны, но это было бы просто решением для моих текущих потребностей, и однажды его станет недостаточно другое кодирование необходимо.

С другой стороны, мне не нужно беспокоиться о направлении слева направо или справа налево, поскольку наше приложение уже может справиться с этим.

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

Редактировать Уточнение: я использую полигональные представления шрифтов. Каждый шрифт заранее создается с размером блока (1,0) и соответствующим образом масштабируется с использованием glScalef(...) перед рендерингом. Я решил отказаться от предварительного растеризации, поскольку пользователи могут увеличивать масштаб достаточно близко (приложение используется для САПР), поэтому растровые артефакты станут видимыми.

Кроме того, поскольку длина сцены редко превышает несколько сотен символов (в основном метки и измерения), прирост скорости от предварительной растеризации незначителен.

Ответы [ 3 ]

3 голосов
/ 15 марта 2010

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

2 голосов
/ 15 марта 2010

Вам необходимо заменить wglOutLineFont .

Чтобы сделать это, сгенерируйте / отобразите необходимые глифы, используя wglOutLineFont , а затем сохраните текстуру в файл растрового изображения. Как только приложение загружается, оно должно загрузить изображение текстуры и координаты текстуры глифа (4 координаты для каждого глифа) и сгенерировать списки отображения (один список для каждого глифа, каждый список отображения должен нарисовать один глиф как текстурированный квад).

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

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

1 голос
/ 15 марта 2010

Удачи в транслитерации этого урока на C ++, хотя я не уверен, насколько хорошо он перейдет в Delphi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...