...
// Выбор шрифта
hFont = CreateFont(-10,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_ROMAN,"Tahoma");
SelectObject(hDc,(HGDIOBJ)hFont);
...
Вывод растровых шрифтов.
на плоский экран - функция ввывода следуюшая:
GLvoid GLENGINEVIEWDEBUGINFO:: PrintBitmapFont(GLint x, GLint y, char *fmt, ...)
{
char text[256];
va_list ap;
if(fmt == NULL) return;
va_start(ap, fmt);
vsprintf(text, fmt, ap);
va_end(ap);
glMatrixMode(GL_PROJECTION); //Выбор матрици проэкции
glPushMatrix(); //Сохраняю её...
glLoadIdentity(); //Сбрасываю матрицу
glOrtho(0, cgl_wprm.Width, 0, cgl_wprm.Height, -1, 1); //Перехожу к плоскому экрану
glMatrixMode(GL_MODELVIEW); //Матрица просмотра модели
glPushMatrix(); //Сохраняю
glLoadIdentity(); //Сбрасываю
//Ну а далее вывод строки переданной в функцию как аргумент.
glTranslated(x, y, 0);
glPushAttrib(GL_LIST_BIT);
glListBase(dbg_bitmapfontbase - 32);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
//--------------------------------------------------------------------------------------
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_DEPTH_TEST);
}
Я сначало думал, что вообще функция прорисовки всеей сцены почему - то ничего
не визуализирует, но потом попробовал вывести несколько
полигонов в 3D режиме всё нормально выводится, а как только
перехожу в плоский так чёрный экран и ничего.
Вот по идее в glOrtho нельзя выводить OutlineFonts, может и
растровые шрифты по какой либо причине нельзя выводить
в glOrtho - не знаю.
Я бы посоветовал забыть о всяческих переходах в ортографическую проекцию. Гораздо удобнее использовать функции glWindowPos расширения GL_ARB_window_pos. С помощью них можно выводить текст в экранных координатах без смены матрицы.
Вот как это делается:
Создание шрифта.
void CreateOpenGLFont(char *fontName, int size)
{
HDC hDC = wglGetCurrentDC();
int FontSize = -MulDiv(GetDeviceCaps(hDC, LOGPIXELSY), size, 72);
HFONT Font = CreateFont(FontSize, 0, 0, 0, 500, false, false, false, 204, 3, 2, 1, 34, fontName);
Offset = glGenLists(256);
SelectObject(hDC, Font);
wglUseFontBitmaps(hDC, 0, 256, Offset);
}
Вывод текста.
void DrawText(int x, int y, char *str)
{
glListBase(Offset);
glWindowPos2iARB(x, y);
glDisable(GL_DEPTH_TEST);
glCallLists(strlen(str), GL_UNSIGNED_BYTE, str);
glEnable(GL_DEPTH_TEST);
}
Где-нибудь при инициализации
Код:
При отрисовке
Код:
...
wglMakeCurrent(hDc,hRc);
wglUseFontBitmaps(hDc,0,255,1000);
glListBase(1000);
glRasterPos2d(x,y);
glCallLists(18,GL_UNSIGNED_BYTE,"Какой нибудь текст");
...
wglMakeCurrent(hDc,hRc);
wglUseFontBitmaps(hDc,0,255,1000);
glListBase(1000);
glRasterPos2d(x,y);
glCallLists(18,GL_UNSIGNED_BYTE,"Какой нибудь текст");
...
Правда, не пойму зачем при каждой отрисовке создавать битмапы символов, но по другому у меня отказалось работать - нифига не выводиться. Так что оставил так как есть ;)
(если быть точнее, то в конструкторе своего класса, т. е. к моменту вызова функции печати,
шрифт должен быть создан):
GLvoid GLENGINEVIEWDEBUGINFO::BuildBitmapFont(GLvoid)
{
HFONT font;
dbg_bitmapfontbase = glGenLists(96);
font = CreateFont( -24, //По высоте символов
0, //Ширина по умолчанию
0, //Без отклонения
0, //Без наклона
FW_BOLD, //700
FALSE, //Без курсива
FALSE, //Не подчёркнутый
FALSE, //Не перечёркнутый
ANSI_CHARSET,
OUT_TT_PRECIS, //Truetype версия
CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY,
FF_DONTCARE|DEFAULT_PITCH,
"Times New Roman");
SelectObject(cgl_ws.hDC, font);
wglUseFontBitmaps(cgl_ws.hDC, 32, 96, dbg_bitmapfontbase);
}
Попробую, выводить с использованием выше упомянутого расширения, только обычно я избегаю
использования расширений, вдруг их моя видюха
поддерживает, а какая-то другая нет.
Что касается расширения GL_ARB_window_pos, то, если мне не изменяет память, оно поддерживается на видеокартах, начиная, по крайней мере, с Riva TNT. Так что найти видеокарту без поддержки этого расширения довольно сложно :).
да и то давно, можешь написать подробней как
GL_ARB_window_pos использовать.
Вывод текста.
void DrawText(int x, int y, char *str)
{
glListBase(Offset);
glWindowPos2iARB(x, y);
glDisable(GL_DEPTH_TEST);
glCallLists(strlen(str), GL_UNSIGNED_BYTE, str);
glEnable(GL_DEPTH_TEST);
}
wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта. Самое главное, чтобы создание происходило после инициализации OpenGL.
не надо, чтоб использовать функций glWindowsPos2iARB ?
Цитата:
Originally posted by bave
wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта. Самое главное, чтобы создание происходило после инициализации OpenGL.
wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта. Самое главное, чтобы создание происходило после инициализации OpenGL.
Я использую OpenGL для рисования в нескольких окошках одного приложения, а т.к. (насколько я понял) для одного процесса может быть создан только один контекст ogl, то в функции рисования, (которая одна на все окошки), приходиться подключать его к нужному hdc. В данном случае не получается при инициализации ogl один раз вызвать wglUseFontBitmaps, хотя шрифты выбраны во всех hdc одинаковые. Стоит сменить окошко для рисования и все - вместо текста фонарь! Поэтому приходиться подстраиваться, вызывая wglUseFontBitmaps при каждом вызове функции прорисовки. Если кто подскажет как этого избежать буду очень признателен.
Для каждого окна может быть создан свой контекст рендеринга. wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта (обязательно после инициализации OpenGL (допустим самого первого окна)). Затем, если ты хочешь этим шрифтом выводить текст в другие окна, необходимо вызвать функцию wglShareLists({контекст рендерига, в котором создан шрифт}, {контекст рендеринга, в котором нужно использовать этот шрифт}).