Все, что говорилось выше, должно подвести вас к заключению о том, что такая технология вывода текста в приложении "клиент/сервер" неэффективна. Более рационально исполь3.4. Дисплейный файл
зовать дисплейные списки (по одному на каждый символ) и сохранить таким образом описание шрифта на сервере. Это очень похоже на использование стандартных растровых матриц символов в алфавитно-цифровых терминалах. Весь набор символов сохраняется в ПЗУ терминала, а затем каждый символ выводится на экран при получении его ASCII-кода- одного байта. Отличие заключается только в качестве получаемого изображения и количестве шрифтов. Ничто не мешает нам определить столько шрифтов, сколько сможет хранить память сервера, а затем использовать описание каждого символа, составленного из отрезков, как любой другой графический объект, и применять по отношению к нему любые преобразования - масштабировать, поворачивать или смещать.
Таким образом, основная идея - передать на сервер описание всех символов шрифта, а затем запрашивать отображение нужных символов, передавая всего один байт, - демонстрирует, насколько эффективным может оказаться использование дисплейных списков в OpenGL. Процедура, по сути, та же, что и при работе с растровыми шрифтами.
Сначала нужно сформировать множество из 96 воспроизводимых ASCII-символов или расширенный набор из 256 символов, если предполагается использовать приложение не только в англоязычных странах.
Определим функцию Our Font ( char с), которая будет вычерчивать любой ASCII-символ с. Эта функция в общих чертах имеет следующий вид: void OurFont(char с) {
switch(c) {
case 'а':
break; case 'A':
break;
}
}
В каждом блоке case нужно позаботиться о размещении символа на экране - каждый очередной символ должен выводиться на определенном расстоянии справа (а иногда и слева) от предыдущего символа. Для перемещения изображения можно воспользоваться функцией glTranslate( ). Пусть, например, у нас есть описание буквы "О" в виде дисплейного списка и желательно вписать ее изображение в единичный квадрат. Соответствующий фрагмент функции OurFont( ) будет выглядеть следующим образом: