В отличие от растровых, размер эскизных символов можно увеличивать без искажения формы символа. Кроме того, для записи эскизных шрифтов требуется меньше памяти, поскольку для каждой версии не нужен отдельный кэш шрифта. Полужирный шрифт, курсив или шрифты различных размеров можно создавать путем изменения определений кривых, образующих контуры символов. Однако для обработки эскизных шрифтов нужно больше времени, поскольку для них необходимо преобразовать стандарты развертки в буфер кадра.
Существует целый ряд возможных функций, позволяющих изображать символы. В некоторых графических пакетах предлагается функция, которая воспринимает в качестве входа любую строку символов и координаты из буфера кадра, указывающее то место, где должна начинаться эта строка. Другой тип функции - это функция, которая служит для изображения отдельного символа в одной или нескольких заданных позициях. Поскольку такая стандартная процедура для изображения символов удобна для того, чтобы показывать метки на схемах сети или строить по точкам график дискретных данных, то символы, которые изображаются с помощью этой стандартной процедуры, иногда называют маркировочными символами или полимаркерами по аналогии с примитивом ломаной линии (polyline). Кроме стандартных символов, в качестве маркировочных символов часто используются такие специальные фигуры, как точки, кружки и крестики. На рис. 3.63 показан график дискретного набора данных, где в качестве маркировочного символа используется звездочка.
Рис. 3.63. График набора значений, построенный с помощью полимаркера Геометрические описания символов задаются во внешних координатах, так, как это делается для других примитивов, а затем с помощью преобразований визуализации эта информация переводится в экранные координаты. Растровый символ описывается с помощью прямоугольной матрицы бинарных значений и исходного положения этой матрицы. Затем это исходное положение переносится в заданную позицию в буфере кадра. Эскизный символ задается с помощью набора координат точек, которые соединяются прямолинейными отрезками или участками кривых линий, и исходного положения, которое переносится в заданную точку буфера кадра. Исходное положение может задаваться либо для отдельного эскизного символа, либо для строки символов. В общем случае, стандартные процедуры для символов позволяют создавать как двух-, так и трехмерные изображения символов.
ФУНКЦИИ ИЗОБРАЖЕНИЯ СИМВОЛОВ В OpenGL
Основная библиотека OpenGL предлагает только низкоуровневую поддержку изображения отдельных символов и текстовых строк. В явном виде любой символ можно задать в виде битового массива, как в примере, показанном на рис. 3.61, и записать набор растровых символов как список шрифта. После этого строка символов изображается - выбранная последовательность битовых массивов из списка шрифта переносится на соответствующие места в буфере кадра.
Однако в OpenGL Utility Toolkit (GLUT) существует несколько предопределенных наборов символов. Поэтому нам не нужно создавать собственные шрифты в виде битовых матриц, если, конечно, не требуется изобразить текст таким шрифтом, которого нет в библиотеке GLUT. Вообще, в библиотеке GLUT содержатся стандартные процедуры для изображения как растровых, так и эскизных шрифтов. Растровые шрифты GLUT визуализируются с помощью функции OpenGL glBitmap, а эскизные шрифты создаются с помощью контуров в виде ломаной линии (GL_LINE_STRIP).