Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/81: Рейтинг темы: голосов - 81, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 40

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

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

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

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

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

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

24
angstrom
13.10.2012, 13:22
На сайте hehe можно прочитать про два основных способа, системный шрифт и битмапы. У каждого есть свои преимущества и недостатки. Первый можно масштабировать, но невозможно добиться качественного отображения, второй даёт отличную картинку, но не масштабируется. Выбор только за вами, где и для чего нужно вывести текст.
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,414
Записей в блоге: 6
13.10.2012, 14:51
Цитата Сообщение от angstrom Посмотреть сообщение
системный шрифт
Это как? Есть Растровый(битмап), Векторный, Текстурный. Какой из них системный?

По скорости лучше говорят текстурный.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.10.2012, 15:02
snake32, а чем растровый от текстурного отличается?
0
angstrom
13.10.2012, 15:28
Под системным я имел в виду шрифты ОС
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  [ТС]
Ну так а с помощью MFC есть вариант выводить сообщения в окно приложения OpenGL?
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,414
Записей в блоге: 6
14.10.2012, 13:28
Цитата Сообщение от lazybiz Посмотреть сообщение
чем растровый от текстурного отличается?
Хороший вопрос.
По сути и там и там отрисовывается заранее подготовленная картинка, но в случае с текстурного для хранения используется текстурная память(и соответственно становятся доступны все ф-ии текстуры, а также задаётся глубина цвета), а для растра - даже не знаю... по-моему там даже другая ветка конвейера задействуется. Для отрисовки растара идёт вызов glBitmap, которая только и может выводить картинки с глубиной цвета 1 бит. То есть качественно вывести шрифт не получится. Хотя последнее надо уточнить...
Цитата Сообщение от angstrom Посмотреть сообщение
wglUseFontBitmaps
Дык это и есть растровый. Этой функцией генерятся битмапы в листах.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.10.2012, 13:40
Цитата Сообщение от lazybiz Посмотреть сообщение
а чем растровый от текстурного отличается
тем что мы сами подкидываемся с монолитной картинкой выпиливая из нее символы вместо того что бы отдать отрисовку каждого символа по системным картинкам на плечи gl) принцип прироста скорости для этого способа не понял + как сказано масштабировать по человечески нельзя
100% есть еще способ кроме естественным путем масштабируемого но очень медленного вектора и достаточно быстрых но не масштабируемых растра и текстуры - например autocad немыслимым способом умудряется отрисовывать колоссальные объемы текста без потери производительности - программа на gl рисуя массив векторного текста 100 на 100 (даже шрифтом txt на самом грубом сглаживании и отрисовке тольк контуров) просто нереально троит. пытался нарыть как же это сделано в autocad - не нашел. подозреваю что они как то рисуют на стандартной не dx канве поверх окна графического вывода или перед выводом формируют для всех отображаемых на чертеже масштабов символов соответствующие битмапы и рисуют растровый текст. хз.
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,414
Записей в блоге: 6
14.10.2012, 14:01
Цитата Сообщение от vxg Посмотреть сообщение
даже шрифтом txt на самом грубом сглаживании и отрисовке тольк контуров
Не совсем понял что значит "даже шрифтом txt"?
+1 autocad рулит. А как вы отрисовывали много векторного текста?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.10.2012, 14:33
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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
14.10.2012, 16:23
Не знаю как вы, но я делаю через листы, текстуры и GetGlyphOutline. И вопрос скорости меня не беспокоит.
Миниатюры
Какими способами лучше выводить текст в OpenGL?  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
14.10.2012, 20:28
Сделаю туториал, если администрация согласится закрепить в разделе "OpenGL" под моим именем.
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,414
Записей в блоге: 6
14.10.2012, 20:52
lazybiz, делайте в блоге
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
14.10.2012, 20:54
snake32, увы, я не веду блоги.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
15.10.2012, 00:20
lazybiz, "критикуя - предлагай" (с)
задача: вывод текста. на рисунке может быть текст разных размеров и шрифтов, под разными углами, отраженный в зеркале.
если через вектор, то для каждого шрифта строится список, размер, угол и отражение выполняются штатными средствами без потери качества.
если через растр, то нужно, как я понял, заводить список еще и для каждого размера. причем с самим размером при использовании wglUseFontBitmaps у меня вышло не все так гладко - нужно задавать его в виде целого числа (как в текстовых редакторах). поэтому вычислить высоту текста в пространстве модели весьма сложно, а зумирование идет прыжками. с функцией GetGlyphOutline не работал - может там по другому. поправьте если, что не так. насколько операция получения списка сложна в плане вычислений по сравнению с рисованием я не знаю - если зумировать списки будут строится в больших количествах и кто победит - хз... привожу пример для вектора - тупняки с массивом текста 100 на 100 заметны (мягко сказано, в заголовке отображается время на построение кадра - у меня оно достигало 360 мс) невооруженным глазом не говоря уже о протестующем жужжании вентилятора ноутбука (панорамирование - нажатие колеса, зумирование - вращение колеса, задать другое количество элементов массива можно указав число в параметрах запуска программы). не могли бы вы показать код решающий вопрос с размером текста и привести аналогичный тест производительности для вашего пути (из выложенного снимка я если честно не очень понял как оно там)?
Вложения
Тип файла: rar gl_txt_test.rar (333.4 Кб, 236 просмотров)
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.10.2012, 00:27
vxg, ты о чем? Я никого не критиковал. Я лишь предложил свой метод.

Не по теме:

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

0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
15.10.2012, 10:05
lazybiz, про критику - это лишь пословица возникшая при громких словах "вопрос скорости, kids, меня не беспокоит", "увековечьте меня в золоте" и "бумагу не мараю". в чем метод, гуру? не пиши текст - покажи самокат.
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 722
25.01.2015, 12:11
castaway расскажите поподробнее о вашем способе, вывод текста на экран. У меня вообще пока не получилось, ни одного. Интересует 2d обычный текст, размер, цвет, позиция на экране. Больше ни чего не надо.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
25.01.2015, 12:48
Цитата Сообщение от zasadadada Посмотреть сообщение
castaway расскажите поподробнее о вашем способе, вывод текста на экран. У меня вообще пока не получилось, ни одного. Интересует 2d обычный текст, размер, цвет, позиция на экране. Больше ни чего не надо.
Если успею, опишу сегодня в блоге.
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
26.12.2019, 06:29
Цитата Сообщение от vxg Посмотреть сообщение
например autocad немыслимым способом умудряется отрисовывать колоссальные объемы текста без потери производительности
с ихним шрифтом .shx да летает, с .ttf заметно тормозит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2019, 06:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru