Итак, в этом уроке я покажу вам, как выводить шрифты с помощью библиотеки FTGL. Прежде всего вам понадобятся .lib, .dll файлы и хидеры этой библиотеки и библиотеки freetype.
Взять их вы можете у меня: FTGL.rar
Кроме того, нужны будут библиотеки и хидеры freetype: freetype.rar
В архиве находятся необходимые .dll-ки, .lib-ы и хидеры. Также я положил туда стандартный шрифт arial.ttf. Не забудьте указать Visual Studio пути, куда вы положите файлы.
Итак, приступим. Для начала создадим совсем простой класс CFont.
Выделим для него два файла: font.h и font.cpp
Файл font.h — хидер класса CFont:
#define __FONT_H#include «main.h»
#include <wchar.h> // Чтобы использовать в программе русский язык, мы будем
// использовать юникод, который хранится в переменных типа wchar_t
// Хидеры FTGL:
#include <ftglFTFont.h>
#include <ftglFTGLBitmapFont.h>
#include <ftglFTGLOutlineFont.h>class CFont{
public:
// Конструктор класса — передаём ему имя .ttf-файла, размер и глубину шрифта.
CFont(char *ttf, int FSize, int FDepth);
// Деструктор класса
~CFont();// Создаваемый для нашей программы шрифт
FTFont *Font;// Простая функция печати текста
void Print(float x, float y, const wchar_t *text);
};
#endif
Вот и всё, осталось описать реализацию класса в файле font.cpp:
#include «font.h»
// Конструктор класса.
// Передаваемые параметры: имя файла шрифта, размер и глубина шрифта.
CFont::CFont(char *ttf, int FSize, int FDepth)
{
// Создаём новый битмапный шрифт
this->Font = new FTGLBitmapFont(ttf);
// Устанавливаем размер шрифта или выходим с ошибкой
if(!Font->FaceSize(FSize)){
MessageBox(NULL,«Can’t set font FaceSize»,«Error»,MB_OK);
exit(1);
}
// Устанавливаем глубину
Font->Depth(FDepth);
// И кодировку — юникод
Font->CharMap(ft_encoding_unicode);
}
// Функция печати текста.
// Первые 2 параметра — экранные координаты (те, что мы установили в 800 и 600),
// третий — текст для печати
void CFont::Print(float x, float y, const wchar_t *text)
{
// Входим в новую матрицу и обнуляем её
glPushMatrix();
glLoadIdentity();
// Выключаем текстуры
glDisable(GL_TEXTURE_2D);
// Перемещаемся на указанные координаты
glTranslatef(x,y,-1);
glRasterPos2f(—1,0.5);
Font->Render(text); // И рендерим текст
glEnable(GL_TEXTURE_2D);
glPopMatrix();
}
Ну вот и все, простой класс шрифта готов. Осталось только использовать его в файле main.cpp:
#pragma comment(lib, «ftgl_dynamic_MT.lib»)// В секции инклудов, где сейчас у нас только main.h, добавляем
// хидеры нового класса и wchar_t:
#include «font.h»
#include <wchar.h>// Следующей строкой обьявим наш класс шрифта:
CFont *Font;//*****************************************************************
// В функции Init(), в самом её конце, добавим инициализацию шрифта:
void Init(HWND hWnd)
{
……
Font = new CFont(«arial.ttf»,16,16);
}// Функция RenderScene(), которая и будет выводить текст:
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// Не обращайте внимания на эту секцию кода. Она просто позволяет нам рисовать,
// передавая OpenGL экранные координаты. Подробнее этот режим мы рассмотрим
// в следующих уроках.
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho( 0,SCREEN_WIDTH,SCREEN_HEIGHT, 0,0, 1 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//*************************************************************************
glDisable(GL_DEPTH_TEST);
glColor3f(1.0f,1.0f,1.0f); // Устанавливаем цвет в белый. Это обязательно, т.к.
// FTGL необходим инициализированный цвет.
Font->Print(200,200, L«Тест»); // Выводим текст
glEnable(GL_DEPTH_TEST);
//*************************************************************************
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
//*************************************************************************
SwapBuffers(g_hDC);
}