≪
≫

ВЫВОД ТЕКСТА

Текст в OpenGL выводится на экран посимвольно и каждый символ представляется как обычный графический образ. Для этого предварительно каждый символ выбранного шрифта готовится в виде BitMap (битового массива) в своем индивидуальном дисплейном списке. Так как дисплейный список имеет числовое имя, то зная код выводимого символа и соответствующее базовое смещение по отношению названий (номеров) дисплейных списком, мы можем активизировать соответствующий список изображения. Рассмотрим эту концептуальную схему вывода текста на экран подробно.

Графическая библиотека имеет готовую команду, строящую набор дисплейных списков для символов заданного шрифта типа TrueType - команду

BOOL wglUseFontBitmaps (HDC hdc, DWORD first,

DWORD count, DWORD listBase)

Параметр hdc - ссылка на контекст устройства, шрифт которого будет использоваться, параметр first - первый код символа, count - количество символов и listBase - стартовый дисплейный список. В итоге после отработки этой команды будут сформированы count битовых образов символов шрифта устройства hdc, начиная с кода first. И каждый битовый образ будет размещен в своем дисплейном списке, начиная с номера listBase. Для указания конкретного места вывода на экране используется команда glRasterPos2i(). Цвет будущего текста настраивается командой glColor*(). И так, пример вывода текста - "Привет OpenGL !!!" :

// Выбираем текущий шрифт системы

SelectObject (hDC, GetStockObject (SYSTEM_FONT));

// Форм. 255 дисплейных списков изображений символов, начиная с

И кода 1 и размещая с базового имени дисплейного списка - 1

wglUseFontBitmaps (hDC, 1, 255, 1);

glRasterPos2i(20,10); И С позиции экрана (20,10)

glColor3f(l .0,1.0,0.0); // Желтым цветом

// Выводим 17 дисплейных списков (17 символов текста)

glCallLists (17, GL_UNSIGNED_BYTE, "Привет OpenGL !!!");

Рассмотрим еще один пример, в котором мы попробуем выбирать любой шрифт из системы Windows и изменять размер выводимых символов текста. Для этого нам придется использовать функцию GDI CreateFont(), которая создает логический шрифт с соответствующими атрибутами. Рассмотрим назначение ее параметров:

HFONT CreateFont (

int nHeight, И Высота фонта (ячейки символа)

int nWidth, И Средняя ширина символа

int nEscapement, И Угол отношения

int nOrientation, И Угол наклона к оси х

int/nWeight, И Ширина шрифта

DWORD fdwltalic, И Курсив

DWORD fdwUnderline, И Подчеркивание

DWORD fdwStrikeOut, И Перечеркивание

DWORD fdwCharSet, И Идентификатор набора символов

DWORD fdwOutputPrecision, И Точность вывода

DWORD fdwClipPrecision, И Точность отсечения

DWORD fdw Quality, И Качество вывода

DWORD fdw PitchA nd Family, II Настройка шага и семейства

LPCTSTR IpszFacef, И Название шрифта (!)

Если значение параметра nHeight установить со знаком минус, то мы сообщаем Windows, что надо найти нам шрифт, основанный на высоте символов. Если мы используем положительное число, мы выбираем шрифт, основанный на высоте ячейки.

Среднюю ширину символа (nWidth) обычно задают по умолчанию, для этого достаточно указать в этом поле значение 0.

Параметры nEscapement и nOrientation задают нулями. Если кому требуется изменять угол наклона символов - экспериментируйте, используя документацию MSDN.

Ширина шрифта (fnWeighf) может принимать значения из диапазона 0-1000. Но на практике пользуются только некоторыми значениями, которые и представлены как символьные константы: FW_DONTCARE - 0, FW_NORMAL - 400, FW_BOLD - 700, и FW_BLACK - 900. Чем выше значение, тем более жирный шрифт.

Значение TRUE параметра fdw Italic разрешает делать курсив.

Значение TRUE параметра fdw Unde гline разрешает делать подчеркивание.

Значение TRUE параметра fdwStrikeOut разрешает делать перечеркивание.

Тип набора символов определяет параметр fdwCharSet, например, RUSSIAN.CHARSET, ANSI_CHARSET, DEFAULT_CHARSET, OEM-CHARSET, SYMBOL_CHARSET и т.д.

Параметр fdwOutputPrecision сообщает Windows какой из наборов символов использовать, если их доступно больше чем один. Если -OUT_TT_PRECIS, то система должна выбрать Traetype версию шрифта. Truetype шрифты всегда смотрят лучше, особенно когда масштабируются символы. При использовании константы OUT_TT_ONLY_PRECIS система должна использовать только Truetype шрифт.

Точность отсечения (fdwClipPrecision) обычно ставится по умолчанию - CLIP_DEFAULT_PRECIS.

Качество вывода (fdwQuality) управляет алгоритмом реалистичности при формировании символов и может принимать значения: PROOF_QUALITY, DRAFT-QUALITY, NONANTIALIASED_QUALITY, DEFAULT-QUALITY или ANTIALIASED-QUALITY. Из контекста названий констант можно определиться с выбором. В нашей программе будем использовать значение ANTIALIASED_QUALITY.

Предпоследний параметр (fdwPitchAndFamily) отвечает за шаг и семейство шрифтов. Возможные значения: FF_SWISS, FF_DECORATIVE, FF_DONTCARE, FF.MODERN, FF.ROMAN и FF.SCRIPT, Для нашего примера можно воспользоваться комбинацией: FF_DONTCAREIDEFAULT_PITCH

Последний параметр (IpszFace) определяет используемый шрифт. В данном случае - "Times New Roman Cyr".

HFONT hFont; I I Windows шрифт

GLuint base; // Базовый номер дисплейного списка

void glPrintText(unsigned int base, char *string) {

if((base == О II string == NULL))

return;

glPushAttrib(GL_LIST_BIT);

glListBase(base - 32);

glCallLists(strlen(string),GL_UNSIGNED_BYTE, string);

glPopAttribO;

}

GLvoid CFont(char *fontName, int Size)

{

base = glGenLists(224); // Выделяем место под 224 символа

И Создаем шрифт hFont = CreateFont(Size, О, О, О, FW_BOLD, FALSE, FALSE, FALSE, ANSI.CHARSET, OUT_TT_PRECIS,

CLIP_DEFAULT_PRECIS,

ANTIALIASED.QUALITY,

FF_DONTCARE I DEFAULT-PITCH, fontName);

SelectObject(hDC, hFont); // Выбираем созданный шрифт // Форм. 224 дисплейных списков изображений символов, начиная с // кода 32 и размещая с базового имени дисплейного списка - base wglUseFontBitmaps(hDC, 32, 224, base);

DeleteObject(hFont); // Удаляем шрифт }

// Инициализация GL

int InitGL(GLvoid) {

glShadeModel(GL_SMOOTH);

glClearColor(0.0f, O.Of, O.Of, 0.5f);

glClearDepth(l.Of);

glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LEQUAL);

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); ц *********фОрмируем шрифт ********* CFont("Courier", 36);

return TRUE; }

GLvoid Draw()

{

unsigned int ListBase;

glClear(GL_COLOR_BUFFER_BITIGLJDEPTH_BUFFER_BIT);

glLoadldentityO;

glRasterPos2i(20, 10);

glColor3f(1.0, 1.0, 0.0);

PrintText(base, "Привет OpenGL!!!");

}

Для корректного завершения работы графического приложения рекомендуется удалять из памяти дисплейные списки отведенные под символы:

GLvoid KillFont(GLvoid) // Удаление дисплейных списков

{

glDeleteLists(base, 224); // Удаление 224 символа

}

 
Посмотреть оригинал