Как сделать, OpenGL живет рендеринг текста для GUI?

Я реализую GUI, созданный сверху OpenGL. Я пришел к проблеме, которую каждый GUI будет иметь - текстовый рендеринг. Я знаю о нескольких методах рендеринга текста в OpenGL, однако, я задаюсь вопросом, кто из них подошел бы лучше всего для GUI.

Обычно в GUI у нас есть два типа текста - статичный и живой. Статичный достаточно легко - мы можем представить TTF к структуре и забыть об этом. Это - "живой" текст, который больше беспокоит меня - воображают консоль или живой чат в многопользовательской игре.

Я думал о нескольких опциях:

  • никакие особые случаи - не представляют и не загружают структуру каждый раз текстовые изменения, имея в виду только для перерендеринга его, когда на самом деле новый текст появляется, и пытающийся разделить больший текст на мелкие детали (как на разговорный канал). Однако это все еще оставило бы нас зависающий в случаях как строка счета, которая изменяется все время, или вводный текст, который представляет "на символ" (стиль печатающего устройства, замеченный в некоторых научно-фантастических играх)
  • четверка - на символ - это также кажется популярным решением, Вы готовите структуру с таблицей ASCII и представляете текстурированный квадратический символ. Однако у меня есть серьезные сомнения относительно эффективности такого решения. Подсказки, как сделать это быстрее, также приветствовались бы.
  • гибридные решения - однако я понятия не имею, как реализовать это чисто

Вопрос следовательно - как представить текст в OpenGL эффективно?

Если это помогает, я кодирую в C++ STL/Boost-heavy и стремлюсь к GForce 6 и более поздним видеокартам.

41
задан Ciro Santilli 新疆改造中心法轮功六四事件 1 May 2016 в 09:21
поделиться

4 ответа

Да, да.

За исключением того, что это не «плохой стиль», это браузер хром. Элементы формы являются частью браузера. «Стиль» их смущает пользователя и препятствует удобству использования. Серьезно, просто оставь их в покое.

Независимо от того, как далеко вы идете с дизайном ввода, вы неизбежно попадете в кирпичную стену элемента загрузки файла, который практически невозможно стилизовать. И если вы не можете стилизовать их всех, зачем стилизовать любого из них.

Серьезно, это сродни стилю полос прокрутки. Не беспокойтесь.

-121--3133477-

JDBC не поддерживает этот параметр (хотя этот параметр может быть предложен определенным драйвером БД). В любом случае, не должно быть проблем с загрузкой всего содержимого файла в память.

-121--1281097-

EDIT2: Шон Барретт только что выпустил Растровые шрифты для C/C + + 3D программистов .

EDIT: другой кодовый драгоценный камень, который заслуживает внимания, это Font Stash , который использует stb _ truetype.h Шона Барретта.


Можно создать текстуру, в которой отображаются все символы шрифта. Тогда вы просто рисуете текстурированные квадраты с ортогональной проекцией и правильными координатами текстуры: такой подход работает, когда ваш текст на языке, который не содержит много символов: как английский. Текстура шрифта создается один раз в начале приложения, а затем четверостишие становится действительно быстрым.

Это то, что я использую, и я считаю, что это самый быстрый способ рендеринга текста в OpenGL. Сначала я использовал инструмент Angelcode's Bitmap Font Generator , а затем непосредственно интегрировал FreeType и построил большую текстуру, содержащую все глифы при запуске приложения. Что касается советов по улучшению скорости визуализации квадров, я только что использовал VBO как для остальной геометрии в моем приложении.

Я удивлен, что у вас есть сомнения в четверостишии, в то время как вы, кажется, не беспокоитесь о производительности генерации текстуры на процессоре, то его загрузки, то связывания его, чтобы, наконец, рендеринг прямоугольника с ним, что для каждого кадра. Изменение состояний OpenGL является узким местом, а не 500-1000 квадров, которые вы будете использовать для текста.

Также посмотрите на библиотеки, такие как библиотека FTGL , которая преобразует весь шрифт в многоугольники (геометрические шрифты).

30
ответ дан 27 November 2019 в 00:51
поделиться

Использование JDBC невозможно, так как он не поддерживает. Обойти можно, включив iBatis iBATIS является рамка сохранения и вызвать конструктор Scriptrunner , как показано в документации iBatis .

Нехорошо включать тяжелую рамку персистентности, такую как ibatis, чтобы запускать простые sql-скрипты любыми способами, которые можно сделать с помощью командной строки

$ mysql -u root -p db_name < test.sql
-121--1281094-

Я не знаю, какую платформу или язык вы используете - Но на платформе .Net есть проект Microsoft Research под названием Chess , который выглядит очень многообещающим, чтобы помочь тем из нас, кто делает многопоточные компоненты, в том числе без блокировки.

Я не использовал его огромное количество, ум.

Это работает (грубое объяснение) путем явного перемежения потоков максимально жесткими способами, чтобы фактически вытеснить ваши ошибки в дикую природу. Он также анализирует код, чтобы найти общие ошибки и плохие узоры - аналогично анализу кода.

В прошлом я также создал специальные версии рассматриваемого кода (через # if blocks и т.д.), которые добавляют дополнительную информацию отслеживания состояния; счетчики, версии и т.д., в которые я могу затем погружаться в рамках единичного теста.

Проблема в том, что для написания кода требуется гораздо больше времени, и вы не всегда можете добавить такие вещи без изменения базовой структуры кода, который уже есть.

-121--1529886-

Попробуйте прочитать следующее: http://dmedia.dprogramming.com/?n=Tutorials.TextRendering1 .

Описанный подход является типичным методом визуализации текста с помощью графических API. Один символ на квадрат и все данные изображения для текста в одной текстуре. Если вы можете поместить весь набор символов в одну текстуру (фактически, в зависимости от размера текстуры, вы можете уместить несколько), визуализация выполняется очень быстро.

Ключ заключается в том, что привязка текстур - это операция, которую необходимо минимизировать. Если можно визуализировать весь текст с одной текстурой, неважно, сколько текста нужно поместить на экран. Даже если вам придется несколько раз переключать текстуры (различные шрифты, различные атрибуты шрифта [полужирный шрифт, подчеркивание и т.д.]), производительность все равно должна быть хорошей. Производительность текста может быть более критической для HUD, но она менее важна в GUI.

9
ответ дан 27 November 2019 в 00:51
поделиться

на 2-х четырехсота.

Я использовал его с шрифтами X11, используя XLoadQueryFont, Glgenlists, glxusexfont, glcalllists У вас есть массив списков отображения, описывающих каждый символ.

Функция GLCallLists принимает аргумент Char * для вашего текста, и он может быть встроена внутри списка дисплея.

Итак, вы в конечном итоге с одним вызовом для отображения блоков текста.

Текстура шрифта, предложенная G. Pakosz, аналогична, но вы вычисляете свои собственные списки отображения «по символу».

Ваши первые варианты будут довольно медленнее, поскольку он потребует рендеринга процессора на основе каждого изменения текста.

1
ответ дан 27 November 2019 в 00:51
поделиться

Введите код здесь , если вы упростите (для теста)

$('#'+newId).dialog({autoOpen: true, modal: true, width:width }); 

и сделайте его:

$('#SaisieARModal').dialog({autoOpen: true, modal: true, width:width }); 

отображается ли модаль? Также вы пробовали BGIFRAME: TRUE вариант?

Не уверены, что ни одно из этого совершенно релевантно, но что-то вкладывает (скорее всего) свидетельствует позади модального материала.

Отредактируйте: Еще одна вещь, если вы измените:

$(function() { $("#MytextInputID").datepicker({ dateFormat: 'dd/mm/yy' }); });

на

    $(function() { 
       $("#MytextInputID").datepicker({ dateFormat: 'dd/mm/yy' });
       $("#MytextInputID").click(function(){alert("working");});
    });

, появляется ли предупреждение?

-121--2669386-

может просто использовать эти две функции:

void renderstring2d(char string[], float r, float g, float b, float x, float y)
{
    glColor3f(r, g, b);

    glRasterPos2f(x, y);
    for(unsigned int i = 0; i < strlen(string); i++)
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, string[i]);
}

void renderstring3d(char string[], float r, float g, float b, float x, float y, float z)
{
    glDisable(GL_LIGHTING);
    glColor3f(r, g, b);

    glRasterPos3f(x, y, z);
    for(unsigned int i = 0; i < strlen(string); i++)
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, string[i]);
}

, затем, когда вы видите 2D текста, не забудьте сбросить как ModelView и Mative Maties.

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();

// Render text and quads

glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();

Вам не нужно представлять к четыреху с использованием этих функций, поскольку эти функции образуются непосредственно к кадру.

И если это не работает для вас, проверьте это. http://www.opengl.org/resources/faq/technal/fonts.htm

Он говорит о рендеринге текста с использованием GLBITMAP, GLDRAWPIXELS и ALPHA SLINGE.

1
ответ дан 27 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: