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


Урок 13. Растровые шрифты - часть 6


{

   glDeleteLists(base, 96);        // Удаление всех 96 списков отображения ( НОВОЕ )

}

 

Теперь моя удобная первоклассная функция вывода текста GL. Вы вызываете этот раздел кода по команде glPrint ("здесь сообщение"). Текст находится в строке символов *fmt.

GLvoid glPrint(const char *fmt, ...)        // Заказная функция «Печати» GL

{

 

В первой строке кода ниже выделяется память для строки на 256 символов. text – это строка, которую мы хотим напечатать на экране. Во второй строке ниже создается указатель, который указывает на список параметров, которые мы передаем наряду со строкой. Если мы посылаем переменные вместе с текстом, она укажет на них.

 

  char    text[256];      // Место для нашей строки

  va_list    ap;          // Указатель на список аргументов

 

В следующих двух строках кода проверяется, если, что-нибудь для вывода? Если нет текста, fmt не будет равняться ничему (NULL), и ничего не будет выведено на экран.

 

  if (fmt == NULL)     // Если нет текста

    return;            // Ничего не делать

 

  va_start(ap, fmt);           // Разбор строки переменных

      vsprintf(text, fmt, ap); // И конвертирование символов в реальные коды

  va_end(ap);                  // Результат помещается в строку

 

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


Команду glListBase(base-32) немного трудно объяснить. Скажем, что мы рисуем символ 'A', он задан номером 65. Без glListBase(base-32) OpenGL, не понял бы, где найти этот символ. Он стал бы искать этот символ в 65 списке отображения, но если бы база была равна 1000, 'A' был бы фактически сохранен в 1065 списке отображения. Поэтому при помощи, установки базовой отправной точки, OpenGL знает, где находится нужный список отображения. Причина, по которой мы вычитаем 32, состоит в том, что мы не сделали первые 32 списка отображения. Мы опустили их. Так что мы должны указать OpenGL про это, вычитая 32 из базового значения. Символы, кодируются, начиная с нуля, код символа пробела имеет значение 32, поэтому если, мы хотим вывести пробел, то мы должны иметь тридцать второй список отображения, а у нас он нулевой. Поэтому мы искусственно занижаем значение базы, с тем, чтобы OpenGL брал нужные списки. Я надеюсь, что это понятно.




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



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