Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод растровых шрифтов.

279
25 июня 2005 года
bave
456 / / 07.03.2004
Почему не выводятся растровые шрифты
на плоский экран - функция ввывода следуюшая:

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 - не знаю.
8.2K
27 июня 2005 года
Akela
64 / / 13.05.2005
Как и когда ты создаешь дисплейные списки для шрифта?

Я бы посоветовал забыть о всяческих переходах в ортографическую проекцию. Гораздо удобнее использовать функции 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);
}
4.7K
27 июня 2005 года
kelz
42 / / 21.06.2004
Я делал так:

Где-нибудь при инициализации

 
Код:
...
// Выбор шрифта
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);
...


При отрисовке

 
Код:
...
wglMakeCurrent(hDc,hRc);
wglUseFontBitmaps(hDc,0,255,1000);
glListBase(1000);
glRasterPos2d(x,y);
glCallLists(18,GL_UNSIGNED_BYTE,"Какой нибудь текст");
...


Правда, не пойму зачем при каждой отрисовке создавать битмапы символов, но по другому у меня отказалось работать - нифига не выводиться. Так что оставил так как есть ;)
279
28 июня 2005 года
bave
456 / / 07.03.2004
От так я их создаю, функция вызывается в ините
(если быть точнее, то в конструкторе своего класса, т. е. к моменту вызова функции печати,
шрифт должен быть создан):
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);
}
Попробую, выводить с использованием выше упомянутого расширения, только обычно я избегаю
использования расширений, вдруг их моя видюха
поддерживает, а какая-то другая нет.
8.2K
28 июня 2005 года
Akela
64 / / 13.05.2005
Если ты создаешь списки в конструкторе, то велика вероятность того, что на момент исполнения конструктора OpenGL еще не инициализирован (особенно если объект класса GLENGINEVIEWDEBUGINFO является статическим).

Что касается расширения GL_ARB_window_pos, то, если мне не изменяет память, оно поддерживается на видеокартах, начиная, по крайней мере, с Riva TNT. Так что найти видеокарту без поддержки этого расширения довольно сложно :).
279
28 июня 2005 года
bave
456 / / 07.03.2004
Я из расширений только объёмный туман использовал,
да и то давно, можешь написать подробней как
GL_ARB_window_pos использовать.
8.2K
28 июня 2005 года
Akela
64 / / 13.05.2005
Всё просто. Функция glWindowPos2iARB(x, y) устанавливает текущую позицию растра по координатам окна (x, y). Проще говоря она задает позицию в оконных координатах, в которой будет выводиться текст.

Вывод текста.

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);
}
8.2K
28 июня 2005 года
Akela
64 / / 13.05.2005
wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта. Самое главное, чтобы создание происходило после инициализации OpenGL.
279
28 июня 2005 года
bave
456 / / 07.03.2004
А не каких хитрых штук в инициализации делать
не надо, чтоб использовать функций glWindowsPos2iARB ?
4.7K
29 июня 2005 года
kelz
42 / / 21.06.2004
Цитата:
Originally posted by bave
wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта. Самое главное, чтобы создание происходило после инициализации OpenGL.



Я использую OpenGL для рисования в нескольких окошках одного приложения, а т.к. (насколько я понял) для одного процесса может быть создан только один контекст ogl, то в функции рисования, (которая одна на все окошки), приходиться подключать его к нужному hdc. В данном случае не получается при инициализации ogl один раз вызвать wglUseFontBitmaps, хотя шрифты выбраны во всех hdc одинаковые. Стоит сменить окошко для рисования и все - вместо текста фонарь! Поэтому приходиться подстраиваться, вызывая wglUseFontBitmaps при каждом вызове функции прорисовки. Если кто подскажет как этого избежать буду очень признателен.

8.2K
29 июня 2005 года
Akela
64 / / 13.05.2005
Для каждого окна может быть создан свой контекст рендеринга. wglUseFontBitmaps(hDc,0,255,1000) достаточно вызвать один раз при создании шрифта (обязательно после инициализации OpenGL (допустим самого первого окна)). Затем, если ты хочешь этим шрифтом выводить текст в другие окна, необходимо вызвать функцию wglShareLists({контекст рендерига, в котором создан шрифт}, {контекст рендеринга, в котором нужно использовать этот шрифт}).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог