PMG

Форумы по созданию игр
Текущее время: 02 дек 2021 22:36

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: О использовании матричных шрифтов
СообщениеДобавлено: 05 сен 2005 15:26 
Не в сети
Любитель

Зарегистрирован: 15 авг 2005 21:32
Сообщения: 46
Откуда: NSK
1. Я выложил на своем сайте редактор матричных шрифтов, полезная вещь =) главное не заставлять его глючить и работать с ним желательно в полноэкранном режиме:
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]));

_________________
Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс =))


Последний раз редактировалось DDMZ 12 июн 2010 18:08, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 сен 2005 14:39 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Ситуация проста - не пользуйся glBitmap. Не пользуйся вообще 2D функциями в OGL. Так как они плохо оптимизированы. Надо пользоваться 3D функциями.

У матричных шрифтов есть один недостаток - нет сглаживания. Поэтому пользуют текстурные фонты:
http://students.cs.byu.edu/~bfish/

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 сен 2005 20:36 
Не в сети
Любитель

Зарегистрирован: 15 авг 2005 21:32
Сообщения: 46
Откуда: NSK
MagicWolf писал(а):
Ситуация проста - не пользуйся glBitmap. Не пользуйся вообще 2D функциями в OGL. Так как они плохо оптимизированы. Надо пользоваться 3D функциями.

Чем их можно заменить? Какие есть 3Д аналоги?

Вот моя демка работы с матричными шрифтами.
http://gssoft.pp.ru/gssoft.pp.ru/files/MatrFonDemo.rar (40кб)

_________________
Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс =))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2005 11:34 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
3D аналог - это текстура. Т.е. буквы как части одной текстуры и рендеришь как прямоугольник. У NeHe этому посвящен Урок 17. Двухмерные шрифты из текстур. Но там только моноширийные шрифты, пропорциональные шрифты со сглаживанием на http://students.cs.byu.edu/~bfish/

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2005 11:52 
Не в сети
Любитель

Зарегистрирован: 15 авг 2005 21:32
Сообщения: 46
Откуда: NSK
3D аналоги, имелось ввиду аналогичные 3D функции. Которые способны заменить glBitmap и т.п поскольку для моей ситуации рационально использовать матричный шрифт. Да и со старо давних времен привык я к нему =)

Например из 1го!! самого простого матричного шрифта можно получить 10ки непохожих друг на друга шрифтов! Если кому инетерсно как можно над ними издеваться, берем спектрумовскую прессу типа ZX-RVIEW или ZX-FORUM с сайта HTTP://ZX.DA.RU и творим!
Например сдвинув нижнюю половину в одну из сторон получи курсив, можно даже за пару действй привратить обычный в готический. Вообщем ограничивается только фантазией =)

Зы. если отключить вертикальную синхронизацию, то FPS не падают ниже 1000FPS при заполнении каждой строчки.

_________________
Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс =))


Последний раз редактировалось DDMZ 07 сен 2005 12:07, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2005 11:58 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Сто процентной замены нет! Просто матричный шрифт надо засунуть в текстуру и от туда выводить уже буквы на экран в ортографической проекции.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2005 12:12 
Не в сети
Любитель

Зарегистрирован: 15 авг 2005 21:32
Сообщения: 46
Откуда: NSK
существует еще функция void glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
в качестве типов данных для этой функции можно передавать:
GL_BITMAP
по одному биту на пиксель, биты хранятся в 8-ми битовых целых (тот же формат, что и для glBitmap())

Как заставить ее принимать данные такого типа? я немного поэксперементировал, ничего неполучилось... и ничего невыодилось, самый выдающийся результат это подвисание программы...

_________________
Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс =))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2005 13:34 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
glDrawPixels - это тоже 2D, работает тоже не ахти быстро.
glDrawPixels(w,h GL_COLOR_INDEX, GL_BITMAP, bits );

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: О использовании матричных шрифтов
СообщениеДобавлено: 12 июн 2010 18:17 
Не в сети
Любитель

Зарегистрирован: 15 авг 2005 21:32
Сообщения: 46
Откуда: NSK
Поправил ссылку на старый редактор, добавил в архив ещё одну старую утилиту для уменьшения матрицы символа по горизонтали. т.е. буква i может занимать например вместо матрицы 8х8 только 2х8 (пиксель отступ и вертикальная черточка с точкой в 1 пиксель)

А вот MatrFonDemo.rar - я у себя не нашел, если он ни у кого не сохранился то мы его навсегда потеряли :)

Кстати, с матричными шрифтами ещё под DOSом неплохо можно работать. Я же перешел на самодельную модификацию: текстурные шрифты разного геометрического размера (т.е. каждый символ может иметь нестандартный размер)

_________________
Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс =))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB