1. Я выложил на своем сайте редактор матричных шрифтов, полезная вещь
![=)](./images/smilies/smile17.gif)
главное не заставлять его глючить и работать с ним желательно в полноэкранном режиме:
http://gssoft.pp.ru/cc/?fontur2 (программа написана мной кодато давным давно)
Помимо редактора вы найдете пример шрифта 8x8 в кодировке DOS
2. Для использования матричных шрифтов в openGL их необходимо перевернуть(в редакторе есть такая кнопка).
Может быть это моя недоаботка при использовании .fon в openGL.
Если да то отпишитесь.
3.Так выглядит код для использования:
ВНИМАНИЕ! Данный код работает только с равносторонними шрифтами, типа 8х8,16х16. Но его лего модифицировать на что то типа: 16х8 и 8х16
Код:
BYTE *font=new byte[32769]; ///font[256][32][4];
//32768 - содержит размер шрифта ,1=8 или 2=16 3=24 или 4=32x32
BYTE *TEMP_BUFF=new byte[1000]; ///Времееный буфер
void printglString(int x,int y, const byte *s, ...) // процедура выводящая текст на экран
{
va_list ap; // Указатель на переменный список аргументов
glRasterPos2i(x,y);
if (s==NULL) return;
va_start(ap, s); // Анализ строки на переменные
vsprintf(TEMP_BUFF, s, ap); // И конвертация символов в реальные коды
va_end(ap);
glPixelStorei(GL_UNPACK_ALIGNMENT,font[32768]); //Карты n байтные
for (int f=0;f<(int)strlen(TEMP_BUFF);f++){
glRasterPos2i(x,y);
glBitmap(font[32768]*8,font[32768]*8,0,0,0,0,font+(TEMP_BUFF[f]*8*font[32768]*font[32768]));
x+=font[32768]*8;
};
};
В функции рендеринга я делаю так:
Код:
glLoadIdentity(); //Установка координат в начало
glOrtho(0.0, (GLfloat) 1024, 0.0, (GLfloat) 768,-1.0, 1.0); // в выборе координат хозяин барин
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
printglString(0,760,"TEXT"); //текст в самом верху
SwapBuffers(hDC);
Инициализация выглядит так:
Код:
font[32768]=1; //1- знашит шрифт 8x8, 2 = 16, 3=24 и 4=32х32
LoadFile(font,"font8x8.fon"); //грузим весь файл без разбора как есть в буфер font
Вот и все=) работает отменно.
Идея взята не из NEHE! Я подобным шрифтом пользовался еще во времена правления DOS! И тогда его использовал в своих программах.
Теперь у меня вопросы к прочитавшим:
1. Почему если написать примерно 1 кб текста за 1 прорисовку то FPS падает с 1000 до 500 ?
Может кто оптимизирует получше?)
2. например:
выполнив printglString(0,0,"TEXT"); мы увидим слово в самом низу
выполнив printglString(0,764,"TEXT"); мы увидим нижнюю часть слова
а выполнив printglString(0,-1,"TEXT"); мы ничего неувидим, причина в том что glBitmap начинает рисовать снизу вверх и стартовая позиция находится за пределами экрана. Устройство команды glBitmaps таково , что она неработает с координатоми вне экрана...
Как сделать так чтобы видимая часть отрисовалась?
3. Как нужно(лучше) выводить картинки из буфера со стартовыми позициями за пределами экрана?
ДОБАВЛЕНО:
Вот еще 2 варианта:
Необходимо заменить в функции printglString() после команды
Код:
glPixelStorei(GL_UNPACK_ALIGNMENT,font[32768]); //Карты n ,байтные
1.Этот пример имеет прошлый недостаток, но тратит меньше команд, а времени почемуто затрачивает больше. (FPS меньше)
Код:
glRasterPos2i(x,y);
for (int f=0;f<(int)strlen(TEMP_BUFF);f++)
glBitmap(font[32768]*8,font[32768]*8,0,0,font[32768]*8,0,font+(TEMP_BUFF[f]*8*font[32768]*font[32768]));
2.Этот пример с исправленым недостатоком. Может иметь стартовую точку за пределом экрана. Отлично подходит для организации титров=)
Затрачивает времени в 2 раза больше чем прошлый пример. при полной нагрузке тэста.(FPS падают в 1.5 раза)
Код:
glRasterPos2i(0,0);
for (int f=0;f<(int)strlen(TEMP_BUFF);f++)
glBitmap(font[32768]*8,font[32768]*8,-x,-y,font[32768]*8,0,font+(TEMP_BUFF[f]*8*font[32768]*font[32768]));