46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
1

Вывод текста в openGL листы

14.05.2012, 22:43. Показов 1846. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Тут такое дело, сдал сессию, теперь можно продолжать углублять свои познания опенГЛа. Вспомнил што кадато читал уроки от НеХе и там было что то о шрифтах, наброски остались но вот заставить их работать мне не удалось. Прошу вас знатоков помочь мне в обнаружении проблемы или ошибки в коде.

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <windows.h>
#include <GL.H>
#include <glut.h>
#include <stdio.h>
#include <math.h>
#include "dVector.h"
#include "dPrimitive.h"
#include "dBuildFont.h"
 
 
 
    double ax = 0, ay = 0, az = 0;
    double sc = 1;
    double tx =0, ty =0, tz =0;
 
dPrimitive cube;
BuildFonts someText;
 
 
GLfloat cnt1;
 
 
 
void modelview (void);
void draw (void);
void init (void);
void reshape(int w, int h);
void MouseMove(int mx, int my);
void keyboard(unsigned char key, int x, int y);
void mouse (int button, int state, int mx, int my);
void fScreen(int width, int height);
void func_for_frame_anima( int = 0)
{
    draw();
    glutTimerFunc(1,func_for_frame_anima,0);
}
 
void main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Work with reshape");
    glutFullScreen();
    init();
    glutDisplayFunc(draw);
    glutReshapeFunc(reshape);
    
    glutPassiveMotionFunc(MouseMove);
    glutMouseFunc(mouse);
    func_for_frame_anima();
    glutKeyboardFunc(keyboard);
    glutMainLoop();
 
}
void init (void)
{
    glShadeModel(GL_SMOOTH);
    //glEnable(GL_LIGHTING);
    glClearColor(0.0, 0.0, 0.0, 0.5);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    //ShowCursor(false);
    //cube.CreateCube(&dVector3(100));
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    someText.BuildRasterFont("Courier New");
 
}
 
void draw (void)
{
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glColor3f(1.0f, 0.0f, 0.0f);
    // Position The Text On The Screen
    glRasterPos3f(tx, ty, tz);
 
    someText.glPrint("Mortred Ursa Jahrakal!!! - %5.3f", cnt1); // Print GL Text To The Screen
    
    cnt1+=0.051f;                                       // Increase The First Counter
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
    switch(key)
    {
    case '+':
        {
            sc+=0.1;
            break;
        }
    case '-':
        {
            sc-=0.1;
            break;
        }
    case '6':
        {
            tx += 0.2;
            break;
        }
    case '4':
        {
            tx -= 0.2;
            break;
        }
    case '8':
        {
            ty += 0.2;
            break;
        }
    case '2':
        {
            ty -= 0.5;
            break;
        }
    case '9':
        {
            ax += 0.5;
            break;
        }
    case '3':
        {
            ax -= 0.5;
            break;
        }
    case '7':
        {
            ay += 0.5;
            break;
        }
    case '1':
        {
            ay -= 0.2;
            break;
        }
    case '5':
        {
            tz += 0.2;
            break;
 
        }
    case '*':
        {
            tz -= 0.2;
            break;
        }
    case 27:
        {
            exit(0);
            break;
        }
    }
}
 
void reshape(int w, int h)
{
    /*glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective( 60.0f, w/(GLdouble)h, 1.0f, 1000.0f );
    gluLookAt(0.0f, 0.0f, -800.8f,  0.0f, -60.5f, 50.0f,  0.0f, 1.0f, 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glViewport(0, 0, w, h);
    glLoadIdentity();*/
 
 
    if (h == 0)                                     // Prevent A Divide By Zero By
    {
        h=1;                                        // Making Height Equal One
    }
 
    glViewport(0, 0, w, h);                     // Reset The Current Viewport
 
    glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
    glLoadIdentity();                                   // Reset The Projection Matrix
 
    // Calculate The Aspect Ratio Of The Window
    gluPerspective(45.0f, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);
 
    glMatrixMode(GL_MODELVIEW);                         // Select The Modelview Matrix
    glLoadIdentity();
        
}
 
void MouseMove(int mx, int my)
{
    //user.setX(mx);
}
void mouse (int button, int state, int mx, int my)
{
    //if(state == GLUT_DOWN)
        //user.mouse_down(button);
}
 
void modelview(void)
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotated( ax, 1, 0, 0 );
    glRotated( ay, 0, 1, 0 );
    glRotated( az, 0, 0, 1 );
    glScaled( sc, sc, sc );
    glTranslated(tx, 0, 0);
    glTranslated(0, ty, 0);
    glTranslated(0, 0, tz);
}

и собстна сам класс текста
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
class BuildFonts
{
private:
    unsigned int base;
    HDC          hDC;
public:
    BuildFonts(): base(0), hDC(0)
    {}
    ~BuildFonts()
    {
        deleteRasterFont();
    }
    void BuildRasterFont(const char* fontName)                              // Build Our Bitmap Font
    {
        HFONT   font;                                       // Windows Font ID
        HFONT   oldfont;                                    // Used For Good House Keeping
 
        base = glGenLists(96);                              // Storage For 96 Characters
        font = CreateFont(  -24,                            // Height Of Font
            0,                              // Width Of Font  ,0 as default
            0,                              // Angle Of Escapement(vidnowenn9 
            0,                              // Orientation Angle
            FW_BOLD,                        // Font Weight(zhyrnyi)   0  -  1000
            FALSE,                          // Italic(Kursiv)
            FALSE,                          // Underline(Pid4erkivann9)
            FALSE,                          // Strikeout(Pere4erkivann9)
            ANSI_CHARSET,                   // Character Set Identifier
            OUT_TT_PRECIS,                  // Output Precision
            CLIP_DEFAULT_PRECIS,            // Clipping Precision
            ANTIALIASED_QUALITY,            // Output Quality
            FF_DONTCARE|DEFAULT_PITCH,      // Family And Pitch(wag)
            "Courier New");                 // Font Name
 
        oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
        wglUseFontBitmaps(hDC, 32, 96, base);               // Builds 96 Characters Starting At Character 32
        SelectObject(hDC, oldfont);                         // Selects The Font We Want
        DeleteObject(font);                                 // Delete The Font
    }
    void deleteRasterFont(void)
    {
        glDeleteLists(base, 96);
    }
    void glPrint(const char *fmt, ...)
    {
        char text[256];
        va_list ap;
        if(fmt == NULL)
        {
            return;
        }
        va_start(ap, fmt);
            vsprintf(text, fmt, ap);
        va_end(ap);
        glPushAttrib(GL_LIST_BIT);
        glListBase(base - 32);
        glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
        glPopAttrib();
    }
};
поиск юзал нашел подобный код только усовершенствованный так вон никак не пойму, почему
неправильно генятсо листы.

C++
1
void BuildRasterFont(const char* fontName)
на ето не стоит обращать внимание пока неважно главное пока с 1 шрифтом разобратсо, и возможно есть более универсальные методы, плз наведите на них. Зарание благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2012, 22:43
Ответы с готовыми решениями:

Вывод текста в opengl
Сварганил текстовый рендер, прошу на тестирование и жду рекомендаций. Необходим TaoFramework и Net...

OpenGL C++ вывод текста
Подскажите самый простой способ вывести текст в определенном месте.

Вывод текста OpenGL, C++
Здравствуйте! Имеется строка glPrint(“текст”); Подскажите пожалуйста, как будет выглядеть...

Вывод текста в OpenGL
Здравствуйте, у меня возник вопрос по поводу вывода текста в OpenGL. Я делаю все по книге Михаила...

12
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.05.2012, 09:35 2
1 что значит не правильно геняться?
2 посмотреть тему OpenGL C++ вывод текста
0
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
15.05.2012, 09:47  [ТС] 3
Спасибо, мин 20 назад нашел эту тему, попытался использовать ваш код, и сразу возникли вопросы не только у меня но и у компилятора)
C++
1
AnsiString
C++
1
ide2std(s).c_str()
если s просто объект класса string, то о AnsiString не слыхал( и о второй ф - и даже гугл мало знает или я плохо искал(
я так понимаю мне нужно получить ASCII код каждого символа строки, или я что то не понимаю(
и ещё откуда брать некий
C++
1
hdc
.

Спасибо.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.05.2012, 14:49 4
AnsiString - это наследие Borland Builder, вы можете использовать std::string
ide2std - это моя функция которая использовалась в проекте для приведения IDE зависимых типов к стандартным, можете убрать ее
то есть в GL-функцию нужно передавать C-строку

Добавлено через 2 минуты
hdc - это ссылка на контекст для которого будет генерироваться шрифты, я не знаю какая у вас IDE, в Borland Builder можно использовать контекст формы
C++
1
hdc = GetDC(Form->Handle);
1
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
15.05.2012, 15:11  [ТС] 5
Почитав спецификацию, узнав о возможностях
C++
1
GetTextExtentPointA
а так же
C++
1
glPixelStorei
текстурируя все это и запихнув шрифт в вектор, получил приличные шрифты. Которые прекрасно работают в программе. Осталось узнать как нарисовать 3Д шрифты которые можно жечь и сливать). А так за все спасибо. а dc получил от
C++
1
wglGetCurrentDC()
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.05.2012, 15:28 6
как запихали в вектор если не секрет? 3д рисовать через wglUseFontOutlines указав экструзию
0
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
15.05.2012, 15:46  [ТС] 7
При
C++
1
const char*  ukr = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфівапролджэячсмитьбю QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789";
после обработки символа

C++
1
sign_arr.add_back( IDSign(id, *ukr) );
кажись в Gdi как то так тоже сделано)

C++
1
2
3
4
5
IDSign(GLuint id, char sign) 
       {
          this->sign = sign;
          this->id   = id;
       }
ЗЫ, вектор реализован самостоятельно и уже давно.. но он оч похож на станартный. Хотя пора переходить на Хеш
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.05.2012, 16:03 8
о... я не о том векторе подумал. думал вы шрифты векторизировали, хотел спросить про их быстродействие, а то у меня когда много call_list шрифтовых на экране тормоза начинаются, в то время как AutoCAD отображает просто футбольные поля текста без малейшего тупизма... а по поводу самобытного вектора исполняющего обязанности строки - на мой взгляд это лишняя штука
0
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
15.05.2012, 16:11  [ТС] 9
вот поэтому и пора переходить на Хеш который даст постоянную высокую скорость, поскольку сравнивать каждый символ входящей строки с символом хранящимся в векторе долговато, а так каждый символ проиндексирован в статическом массиве, получаем оптимальную скорость вроде foo(1); а не от n, думаю AutoCAD так и делает) хотя откуда мне знать)) а собственный понадобился из за нехватки сил stla или я просто не нашел нужного мне. А далее можно и свою dll собрать и юзать для всех проектов).
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.05.2012, 16:17 10
тупизм проги происходит не из за векторов-строк - они вообще не вносят вклада в быстродействие - в функцию рендеринга передается C-строка коды символов которой воспринимаются GL как идентификаторы call_list'ов - быстродействие вообще максимальное какое может быть. тупизм вылазает из за большого кол-ва линий использованных для отображения каждого символа или может быстродействие проистекает из-за другого способа отрисовки шрифтов - например как текстур, но тогда нужно при зумировании массивы текстур пересчитывать, я уже не говорю об одновременном отображении букв разных размеров на экране..
0
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
15.05.2012, 16:38  [ТС] 11
Вы меня сильно заинтересовали этим вопросом, буду искать все возможности для отрисовки шрифтов, буду делать многабукаф и тд. Но я думаю проблема глубже возможно шрифты появляются совсем из другого окна или подокна, где исползуются другой буфер и или происходить частичная перерисовка или же вообще не происходит. Мне один знакомый говорил о использовании спец буфера для шрифтов. Нужно будет узнать) Или же писать письмо в AutoCAD они могут и дать часть сорса. Попытка не пытка))

Добавлено через 6 минут
Я всмысле о АвтоКАде)
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.05.2012, 16:39 12
хм.. побуквенная отрисовка в отдельном окне не должна дать выигрыша в производительности. во всяком случае если это OpenGL. а вот если они каким то образом выпечатывают символы специально подогнанных размеров средствами системы а потом накладывают эту кальку на GL то возможно да.. только тогда с выбором объекта надо мучиться и вообще это ломает подход к построению сцены
0
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
15.05.2012, 17:00  [ТС] 13
Ну я думаю все зависит от приоритетов. И существования стандартного подхода как такового не существует, ИМХО, есть лишь набор рекомендаций.
0
15.05.2012, 17:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 17:00
Помогаю со студенческими работами здесь

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

Вывод текста с помощью OpenGL
Читал разные посты на эту тему, смотрел в Гугле, но так и не получилось. Как вывести в 2D допустим...

Вывод текста в окно OpenGL - С++
Как вывести целое предложение или матрицу в окно OpenGL

OpenGL вывод большого количества текста
Доброго времени суток! Использую: - C# + OpenTK Переписываю проект с “immediate mode” на VBO....


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

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

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