Народный учебник по OpenGL


Урок 14. Векторные шрифты - часть 8


 

Высоту символа можно узнать при помощи команды gmfCellIncY. Это может пригодиться при выводе вертикального текста.

 

       for (unsigned int loop=0;loop//Цикл поиска размера строки

                    {

                    length+=gmf[text[loop]].gmfCellIncX;

                    // Увеличение размера на ширину символа

                    }

 

Полученную величину размера строки преобразуем в отрицательную (потому что мы будем перемещаться влево от центра для центровки текста). Затем мы делим длину на 2: нам не нужно перемещать весь текст влево - только его половину.

 

glTranslatef(-length/2,0.0f,0.0f);       //Центровка на экране нашей строки

 

Дальше мы сохраним в стеке значение GL_LIST_BIT, это сохранит glListBase от воздействия любых других списков отображения, используемых в нашей программе.

 

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

 

       glPushAttrib(GL_LIST_BIT); // Сохраняет в стеке значения битов списка отображения

       glListBase(base);          // Устанавливает базовый символ в 0

 

Теперь, когда OpenGL знает расположение всех символов, мы можем сказать ей написать текст на экране. glCallLists выводит всю строку текста на экран сразу, создавая для вас многочисленные списки отображения.

 

Строка, приведенная ниже, делает следующее. Сначала она сообщает OpenGL, где на экране будут находиться списки отображения. strlen(text) находит количество букв, которые мы хотим послать на экран. Далее ему потребуется знать, какой наибольший будет номер списка из подготавливаемых к посылке. Пока что мы не посылаем более 255 символов. Так что мы можем использовать значение GL_UNSIGNED_BYTE (байт позволяет хранить целые числа от 0 до 255). Наконец, мы ему скажем, что отображать при помощи передачи строки text.

На тот случай, если вас удивит, что буквы не сваливаются в кучу одна над другой. Каждый список отображения каждого символа знает, где находится правая сторона предыдущего символа. После того, как буква отобразилась на экране, OpenGL перемещает вывод к правой стороне нарисованной буквы. Следующая буква или объект рисования начнет рисоваться с последней позиции OpenGL после перемещения, находящейся справа от последней буквы.




Начало  Назад  Вперед



Книжный магазин