OpenGL няма вградена поддръжка на шрифтове. Ситуацията е подобна на тази с кривите линии, кръговете и редица други тривиални неща, които отсъстват напълно. Тулкитът предоставя нужната функционалност за имплементация на шрифтове, но всеки трябва да се справя сам с конкретното имплементиране.
Разбира се, шрифтовете и тяхното рендериране са нещо, което е необходимо твърде често, за това и съществуват множество имплементации под формата на библиотеки или просто хедъри. За това в този и няколко следващи поста ще споделя опитът си с няколко от тях под Mac OS X и спецификите, с които съм се сблъсквал.
Няколко думи за самата техника на изобразяване.
Основното, разбира се, е да се опишат символите, представляващи шрифта – глифове – във вид, удобен за работа с OpenGl. Трите групи на§ини това да стане са:
Растерно изобразяване – чрез glBitmap или glDrawPixels. Неудобното е, че при такъв тип изобразяване не могат да се използват матричните трансформации (glTranslate, glRotate, glScale). Също така не е най-удачно от гледна точка на performance.
Геометрично изобразяване – Глифовете се построяват чрез геометричните примитиви – GL_LINES, GL_TRIANGLES, GL_QUADS. Използват се матричните трансформации. Предимство, спрямо растерните, е, че няма проблем изобразяваният текст да се съобразява с осветеност, както и използването на нормалните матрични трансформации.
Текстурно изобразяване – Относително най-разпространеният метод за изобразяване на текст. Предварително се създава една текстура, съдържаща всички глифове от шрифта. След това се мапват регионите съдържащи конкретно интересуващия ни символ. С текста лесно се борави като с текстура. Недостатък е, че за промяна, неосъществима с текстурни трансформации трябва да се създаде нова текстура, с изменени глифове.
На мен, конкретно, за текущите ми нужди, най-добра работа върши геометрично изобразения текст. Лесно мога да деформирам низът, който изобразявам, да изменям цветове, форми и т.н.
Подготовка на глифовете
След като се избере начин за изобразяване на глифовете, следва да се набавят самите те. Начини за това има много. Ако се използват текстури е доста лесно да се създаде нужната текстура, чрез инструмент за обработка на изображения, като GIMP или пък с Mac OS-овския Quartz, като се използват шрифтове от операционната система.
Растерното и геометрично изобразяване, обаче, се явяват по-сериозен проблем. По някакъв начин трябва да се опишат формите и контурите на символите. Едно решение е да си измислим собствен шрифт, който да опишем символ по символ. Но това би бил много труд, който в голяма част от случайте би бил целесъобразен. Далеч по-лесно би било по някакъв начин да се използват готови шрифтове, като тези, които идват с операционните системи (повечето).
Тук се оказва, че качественото и правилно превръщане на векторните шрифтове (каквито са скалируемите шрифтове, които се срещат най-често) в растерно представяне, което да се изобрази на екрана. Това е тежка задача, за която са нужни никак не малко усилия. Тук на помощ ни идва една изключително мощна софтуерна библиотека: FreeType, която е дефакто стандартният начин за изобразяване на шрифтове в свободния свят. Чрез нея може съвсем лесно да се представят повечето шрифтови формати – TrueTypeFont, Type1, OpenType и д.р.
Същинско изобразяване
След като вече имаме инфорамция за контурите на символите от шрифта, остава да я изобразим на екрана с примитивите, предоставени от OpenGL. Това би могло да бъде относително лесно, ако е нужна строго специфична функционалност, но постепенно се превръща в отделен проект, сам по себе си, ако са нужни повече възможности, като различни техинки на изобразяване, оптимизации и улеснения (например display list) и д.р. А това също става ненужно усложнение, тъй като може да се използва и/или нагоди някой от съществуващите проекти за рендериране на текст в OpenGL, за които ще стане дума в следващата част.