PMG https://forum.pmg.org.ru/ |
|
О использовании матричных шрифтов https://forum.pmg.org.ru/viewtopic.php?f=1&t=67 |
Страница 1 из 1 |
Автор: | DDMZ [ 05 сен 2005 15:26 ] |
Заголовок сообщения: | О использовании матричных шрифтов |
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])); |
Автор: | MagicWolf [ 06 сен 2005 14:39 ] |
Заголовок сообщения: | |
Ситуация проста - не пользуйся glBitmap. Не пользуйся вообще 2D функциями в OGL. Так как они плохо оптимизированы. Надо пользоваться 3D функциями. У матричных шрифтов есть один недостаток - нет сглаживания. Поэтому пользуют текстурные фонты: http://students.cs.byu.edu/~bfish/ |
Автор: | DDMZ [ 06 сен 2005 20:36 ] |
Заголовок сообщения: | |
MagicWolf писал(а): Ситуация проста - не пользуйся glBitmap. Не пользуйся вообще 2D функциями в OGL. Так как они плохо оптимизированы. Надо пользоваться 3D функциями.
Чем их можно заменить? Какие есть 3Д аналоги? Вот моя демка работы с матричными шрифтами. http://gssoft.pp.ru/gssoft.pp.ru/files/MatrFonDemo.rar (40кб) |
Автор: | MagicWolf [ 07 сен 2005 11:34 ] |
Заголовок сообщения: | |
3D аналог - это текстура. Т.е. буквы как части одной текстуры и рендеришь как прямоугольник. У NeHe этому посвящен Урок 17. Двухмерные шрифты из текстур. Но там только моноширийные шрифты, пропорциональные шрифты со сглаживанием на http://students.cs.byu.edu/~bfish/ |
Автор: | DDMZ [ 07 сен 2005 11:52 ] |
Заголовок сообщения: | |
3D аналоги, имелось ввиду аналогичные 3D функции. Которые способны заменить glBitmap и т.п поскольку для моей ситуации рационально использовать матричный шрифт. Да и со старо давних времен привык я к нему ![]() Например из 1го!! самого простого матричного шрифта можно получить 10ки непохожих друг на друга шрифтов! Если кому инетерсно как можно над ними издеваться, берем спектрумовскую прессу типа ZX-RVIEW или ZX-FORUM с сайта HTTP://ZX.DA.RU и творим! Например сдвинув нижнюю половину в одну из сторон получи курсив, можно даже за пару действй привратить обычный в готический. Вообщем ограничивается только фантазией ![]() Зы. если отключить вертикальную синхронизацию, то FPS не падают ниже 1000FPS при заполнении каждой строчки. |
Автор: | MagicWolf [ 07 сен 2005 11:58 ] |
Заголовок сообщения: | |
Сто процентной замены нет! Просто матричный шрифт надо засунуть в текстуру и от туда выводить уже буквы на экран в ортографической проекции. |
Автор: | DDMZ [ 07 сен 2005 12:12 ] |
Заголовок сообщения: | |
существует еще функция void glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); в качестве типов данных для этой функции можно передавать: GL_BITMAP по одному биту на пиксель, биты хранятся в 8-ми битовых целых (тот же формат, что и для glBitmap()) Как заставить ее принимать данные такого типа? я немного поэксперементировал, ничего неполучилось... и ничего невыодилось, самый выдающийся результат это подвисание программы... |
Автор: | MagicWolf [ 07 сен 2005 13:34 ] |
Заголовок сообщения: | |
glDrawPixels - это тоже 2D, работает тоже не ахти быстро. glDrawPixels(w,h GL_COLOR_INDEX, GL_BITMAP, bits ); |
Автор: | DDMZ [ 12 июн 2010 18:17 ] |
Заголовок сообщения: | Re: О использовании матричных шрифтов |
Поправил ссылку на старый редактор, добавил в архив ещё одну старую утилиту для уменьшения матрицы символа по горизонтали. т.е. буква i может занимать например вместо матрицы 8х8 только 2х8 (пиксель отступ и вертикальная черточка с точкой в 1 пиксель) А вот MatrFonDemo.rar - я у себя не нашел, если он ни у кого не сохранился то мы его навсегда потеряли ![]() Кстати, с матричными шрифтами ещё под DOSом неплохо можно работать. Я же перешел на самодельную модификацию: текстурные шрифты разного геометрического размера (т.е. каждый символ может иметь нестандартный размер) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |