0 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 40
1

Какими способами лучше выводить текст в OpenGL?

13.10.2012, 11:58. Показов 14579. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,хотелось бы узнать Ваше мнение по поводу вывода текста на экран приложения OpenGL. Насколько я понял возможны 2 способа вывода:
1. С помощью самого OpenGL (пример тут:http://pmg.org.ru/nehe/nehe13.htm)
2. С помощью MFC (точно не уверен в таком способе)
Посоветуйте пожалусто начинающему,какой способ стоит использовать,если таковые вообще являются правильными?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2012, 11:58
Ответы с готовыми решениями:

Какими способами можно вылечить пендинги?
СМАРТ Виктории показал 8 пендингов. Какими способами их можно вылечить?

Какими способами можно создать Луч Wi-Fi!?
1) Есть ли Маршрутизаторы (роутеры) у которых имеется радиус wi-fi более 1 км Если есть то дайте...

Какими способами можно нарисовать таблицу в консоли?
Мне для защиты проекта по программированию нужно создать консольную программку морской бой. Я хотел...

Какими способами можно реализовать перетаскивание окна?
Какими способами можно реализовать перетаскивание окна? Обычно решалось строчкой DragMove(); в...

24
angstrom
13.10.2012, 13:22 2
На сайте hehe можно прочитать про два основных способа, системный шрифт и битмапы. У каждого есть свои преимущества и недостатки. Первый можно масштабировать, но невозможно добиться качественного отображения, второй даёт отличную картинку, но не масштабируется. Выбор только за вами, где и для чего нужно вывести текст.
3249 / 1438 / 234
Регистрация: 26.02.2009
Сообщений: 7,468
Записей в блоге: 5
13.10.2012, 14:51 3
Цитата Сообщение от angstrom Посмотреть сообщение
системный шрифт
Это как? Есть Растровый(битмап), Векторный, Текстурный. Какой из них системный?

По скорости лучше говорят текстурный.
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
13.10.2012, 15:02 4
snake32, а чем растровый от текстурного отличается?
0
angstrom
13.10.2012, 15:28 5
Под системным я имел в виду шрифты ОС
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TDrawMSg.BuildFonts(var aFont : TMsgFont; aPt : Integer; FontName : String; Bold : Boolean);
const
  aBold : array[Boolean] of Integer = (FW_NORMAL, FW_BOLD);
var
  Font,
  OldFont : HFONT;
  TM      : TTextMetric;
begin
  aFont.Base := glGenLists(256);
  Font := CreateFontA(- MulDiv(aPt, GetDeviceCaps(fDC, LOGPIXELSY), 72),
                      0, 0, 0,
                      aBold[Bold],
                      0, 0, 0,
                      ANSI_CHARSET,
                      OUT_TT_PRECIS,
                      CLIP_DEFAULT_PRECIS,
                      ANTIALIASED_QUALITY,
                      FF_DONTCARE or DEFAULT_PITCH,
                      PAnsiChar(AnsiString(FontName)));
  OldFont := SelectObject(fDC, Font);
  GetTextMetrics(fDC, TM);
  aFont.FontWidth  := TM.tmAveCharWidth + 1;
  if FontName <> 'Lucida Console' then
    aFont.FontWidth  := TextWidth(fDC, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') div 52;  // for fonts non monowide
  aFont.FontHeight := TM.tmHeight;
  wglUseFontBitmaps(fDC, 0, 255, aFont.Base);
  DeleteObject(SelectObject(fDC, OldFont));
0 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 40
13.10.2012, 20:49  [ТС] 6
Ну так а с помощью MFC есть вариант выводить сообщения в окно приложения OpenGL?
0
3249 / 1438 / 234
Регистрация: 26.02.2009
Сообщений: 7,468
Записей в блоге: 5
14.10.2012, 13:28 7
Цитата Сообщение от lazybiz Посмотреть сообщение
чем растровый от текстурного отличается?
Хороший вопрос.
По сути и там и там отрисовывается заранее подготовленная картинка, но в случае с текстурного для хранения используется текстурная память(и соответственно становятся доступны все ф-ии текстуры, а также задаётся глубина цвета), а для растра - даже не знаю... по-моему там даже другая ветка конвейера задействуется. Для отрисовки растара идёт вызов glBitmap, которая только и может выводить картинки с глубиной цвета 1 бит. То есть качественно вывести шрифт не получится. Хотя последнее надо уточнить...
Цитата Сообщение от angstrom Посмотреть сообщение
wglUseFontBitmaps
Дык это и есть растровый. Этой функцией генерятся битмапы в листах.
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
14.10.2012, 13:40 8
Цитата Сообщение от lazybiz Посмотреть сообщение
а чем растровый от текстурного отличается
тем что мы сами подкидываемся с монолитной картинкой выпиливая из нее символы вместо того что бы отдать отрисовку каждого символа по системным картинкам на плечи gl) принцип прироста скорости для этого способа не понял + как сказано масштабировать по человечески нельзя
100% есть еще способ кроме естественным путем масштабируемого но очень медленного вектора и достаточно быстрых но не масштабируемых растра и текстуры - например autocad немыслимым способом умудряется отрисовывать колоссальные объемы текста без потери производительности - программа на gl рисуя массив векторного текста 100 на 100 (даже шрифтом txt на самом грубом сглаживании и отрисовке тольк контуров) просто нереально троит. пытался нарыть как же это сделано в autocad - не нашел. подозреваю что они как то рисуют на стандартной не dx канве поверх окна графического вывода или перед выводом формируют для всех отображаемых на чертеже масштабов символов соответствующие битмапы и рисуют растровый текст. хз.
0
3249 / 1438 / 234
Регистрация: 26.02.2009
Сообщений: 7,468
Записей в блоге: 5
14.10.2012, 14:01 9
Цитата Сообщение от vxg Посмотреть сообщение
даже шрифтом txt на самом грубом сглаживании и отрисовке тольк контуров
Не совсем понял что значит "даже шрифтом txt"?
+1 autocad рулит. А как вы отрисовывали много векторного текста?
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
14.10.2012, 14:33 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//---------------------------------------------------------------------------
void Tmain_form::create_fonts(void)
{
    LOGFONT logfont;
 
    logfont.lfHeight = -12;
    logfont.lfWidth = 0;
    logfont.lfEscapement = 0;
    logfont.lfOrientation = 0;
    logfont.lfWeight = FW_BOLD;
    logfont.lfItalic = FALSE;
    logfont.lfUnderline = FALSE;
    logfont.lfStrikeOut = FALSE;
    logfont.lfCharSet = DEFAULT_CHARSET;
    logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
    logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logfont.lfQuality = DEFAULT_QUALITY;
    logfont.lfPitchAndFamily = DEFAULT_PITCH;
    strcpy(logfont.lfFaceName, "Trebuchet MS"); //вот здесь вполне может быть указан шрифт Txt - в нем меньше линий и соответственно меньше количество генерируемых функцией wglUseFontOutlines графических объектов приходящихся на один символ, однако даже этого малого количества слишком много для быстрой работы
 
    font_h = CreateFontIndirect(&logfont); //это будет растровый шрифт
 
    logfont.lfWeight = FW_NORMAL;
    default_font_h = CreateFontIndirect(&logfont); //это будет векторный шрифт
}
//---------------------------------------------------------------------------
void Tmain_form::create_gl_fonts(void)
{
    SelectObject(hdc, font_h);
    font_list = glGenLists(256);
    wglUseFontBitmaps(hdc, 0, 256, font_list); //создаем растровый шрифт
 
    SelectObject(hdc, default_font_h);
    default_font_list = glGenLists(256);
    wglUseFontOutlines(hdc, 0, 256, default_font_list, 0, 0.5, WGL_FONT_POLYGONS, default_gmf); //создаем векторный шрифт
}
//---------------------------------------------------------------------------
void Tmain_form::print(const float x, const float y, const AnsiString s)
{
    //выводим растр
    glRasterPos2f(x, y);
    glListBase(font_list);
    glCallLists(s.Length(), GL_UNSIGNED_BYTE, ide2std(s).c_str());
}
//функция рисования для объекта "текст"
//------------------------------------------------------------------------------
void txt::render(void)
{
    if (!l->on) return; //это для работы системы слоев - объекты слоя могут не рисоваться
 
    if (bw_mode)
    {
        glColor3f(0, 0, 0); //это для распечатки в ч/б
    }
    else
    {
        if (l->locked) glColor3f(locked_r, locked_g, locked_b); //это для подсвечивания объектов на заблокированных слоях
        else if (color_by_layer) glColor3f(l->r, l->g, l->b); //это для объектов наследующих цвет от слоя
        else glColor3f(obj_r, obj_g, obj_b); //это для объектов имеющих индивидуальный цвет
    }
 
    glLoadName(name); //каждый объект имеет имя для возможности интерактивного выбора
 
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
 
    glTranslatef(vs[0].x, vs[0].y, 0); //позиция текста
    glRotatef(a, 0, 0, 1); //текст может быть повернут
    glScalef(my? -s : s, mx? -s : s, 0); //масштабирован
    if (middle_center) glTranslatef(-get_txt_width(value.c_str()) / 2, -0.5, 0); //выровнен
 
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_FILL);
 
    glListBase(default_font_list);
    glCallLists(value.size(), GL_UNSIGNED_BYTE, value.c_str());
 
    glPolygonMode(GL_FRONT, GL_LINE);
    glPolygonMode(GL_BACK, GL_LINE);
 
    glPopMatrix();
}
отрисовывал много векторного текста скрипя зубами и наслаждаясь тупняками. в глубине души - желание попробовать строить растры перед выводом для всех присутствующих на экране масштабов шрифта и выводить растры - быстрее или медленнее будет зависеть от того насколько разные по масштабу символы попадут на чертеж и насколько тяжела функция создания растров.
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
14.10.2012, 16:23 11
Не знаю как вы, но я делаю через листы, текстуры и GetGlyphOutline. И вопрос скорости меня не беспокоит.
Миниатюры
Какими способами лучше выводить текст в OpenGL?  
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
14.10.2012, 20:28 12
Сделаю туториал, если администрация согласится закрепить в разделе "OpenGL" под моим именем.
0
3249 / 1438 / 234
Регистрация: 26.02.2009
Сообщений: 7,468
Записей в блоге: 5
14.10.2012, 20:52 13
lazybiz, делайте в блоге
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
14.10.2012, 20:54 14
snake32, увы, я не веду блоги.
0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
15.10.2012, 00:20 15
lazybiz, "критикуя - предлагай" (с)
задача: вывод текста. на рисунке может быть текст разных размеров и шрифтов, под разными углами, отраженный в зеркале.
если через вектор, то для каждого шрифта строится список, размер, угол и отражение выполняются штатными средствами без потери качества.
если через растр, то нужно, как я понял, заводить список еще и для каждого размера. причем с самим размером при использовании wglUseFontBitmaps у меня вышло не все так гладко - нужно задавать его в виде целого числа (как в текстовых редакторах). поэтому вычислить высоту текста в пространстве модели весьма сложно, а зумирование идет прыжками. с функцией GetGlyphOutline не работал - может там по другому. поправьте если, что не так. насколько операция получения списка сложна в плане вычислений по сравнению с рисованием я не знаю - если зумировать списки будут строится в больших количествах и кто победит - хз... привожу пример для вектора - тупняки с массивом текста 100 на 100 заметны (мягко сказано, в заголовке отображается время на построение кадра - у меня оно достигало 360 мс) невооруженным глазом не говоря уже о протестующем жужжании вентилятора ноутбука (панорамирование - нажатие колеса, зумирование - вращение колеса, задать другое количество элементов массива можно указав число в параметрах запуска программы). не могли бы вы показать код решающий вопрос с размером текста и привести аналогичный тест производительности для вашего пути (из выложенного снимка я если честно не очень понял как оно там)?
Вложения
Тип файла: rar gl_txt_test.rar (333.4 Кб, 234 просмотров)
1
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
15.10.2012, 00:27 16
vxg, ты о чем? Я никого не критиковал. Я лишь предложил свой метод.

Не по теме:

P.S.: ты слишком много пишешь. Лично я не читал дальше первой строки.

0
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
15.10.2012, 10:05 17
lazybiz, про критику - это лишь пословица возникшая при громких словах "вопрос скорости, kids, меня не беспокоит", "увековечьте меня в золоте" и "бумагу не мараю". в чем метод, гуру? не пиши текст - покажи самокат.
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 701
25.01.2015, 12:11 18
castaway расскажите поподробнее о вашем способе, вывод текста на экран. У меня вообще пока не получилось, ни одного. Интересует 2d обычный текст, размер, цвет, позиция на экране. Больше ни чего не надо.
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
25.01.2015, 12:48 19
Цитата Сообщение от zasadadada Посмотреть сообщение
castaway расскажите поподробнее о вашем способе, вывод текста на экран. У меня вообще пока не получилось, ни одного. Интересует 2d обычный текст, размер, цвет, позиция на экране. Больше ни чего не надо.
Если успею, опишу сегодня в блоге.
0
140 / 84 / 23
Регистрация: 31.08.2016
Сообщений: 733
26.12.2019, 06:29 20
Цитата Сообщение от vxg Посмотреть сообщение
например autocad немыслимым способом умудряется отрисовывать колоссальные объемы текста без потери производительности
с ихним шрифтом .shx да летает, с .ttf заметно тормозит
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2019, 06:29
Помогаю со студенческими работами здесь

Какими способами можно передать многомерные массивы в функцию?
Возник вопрос, какими способами можно передать многомерные массивы в функцию??? Если не сложно,...

Нужен совет!Какими способами можно соединить 2 подсети!
Задача заключается в следующем, есть две подсети, связь осуществляется через интернет - vpn, в...

Какими способами можно узнать ключ активации windows
Добрый день, меня интересует как можно узнать текущий ключ винды, но только не с помощью самой ОС,...

Какими способами можно получать отчеты с Windows Server 2008 r2 ?
Добрый день! Хотелось бы спросить совета: какими способами можно получать отчеты с Windows Server...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru