Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
1

Модификация примера работы с GLUT

02.01.2021, 22:44. Показов 1913. Ответов 30

Author24 — интернет-сервис помощи студентам
Начал читать статью:
http://www.rusdoc.ru/material/... glut.shtml
Всё работает. Возникли вопросы:
1). Зачем создавать дочернее окно и рисовать в нём, когда есть окно консоли?
Как я понимаю, буфер консоли "заточен" под вывод символьной информации и не пригоден для вывода графики. Библиотека GDI работает с контекстом устройства и, судя по всему, так же использует что-то похожее.
Можно получить параметры консоли:
C++
1
2
3
4
    HWND hwnd = GetConsoleWindow(); //Получаем дескриптор окна консоли
   RECT rc;
    GetClientRect(hwnd, &rc);
   printf(" X=%i Y=%i",rc.right,rc.bottom);
и затем создать окно с теми же параметрами:
C++
1
glutInitWindowSize(rc.right, rc.bottom);
Можно получить идентификатор активного окна: glutGetWindow, но если использовать вместо glutCreateWindow("Romka Demo");, получаю фатальную ошибку.
Есть ли способ использовать окно командной строки для реализации вышеприведённого примера?
2). Зачем функции glutInit(&argc, argv); параметры командной строки? И нет ли возможности обойти это условие?
Понимаю, что начав прочтение одной единственной статьи, всего не понять. Просто хочется ответов на первые же возникшие вопросы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2021, 22:44
Ответы с готовыми решениями:

Поясните основные принципы работы с GLUT
Только начал изучать OpenGl из различных источников, но в них как-то сложно описан порядок...

Разбор примера работы побитового И
Здравствуйте, в процессе моего изучения побитовых операций возникли некоторый вопросы, на которые...

Перевод примера работы с реестром с дельфей на билдер
Пока каникулы пробую то что давно хотел сделать а именно первые шаги по практике с переводом...

Г.Шилдт C# 4.0. Полное руководство. Разбор примера работы с массивом
Доброго времени суток форумчане! Не давно начал изучать творения данного автора. Столкнулся с...

30
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
02.01.2021, 23:15 2
1)Потому что нужно окно, поддерживающее контекст OpenGL, консольное окно его не поддерживает, и изменить формат поверхности не получится.
2) Что бы можно было задавать параметры: https://www.opengl.org/resourc... ode10.html
1
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
02.01.2021, 23:30  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
изменить формат поверхности не получится.
Был пример с отображением рисунка в консольном окне с помощью библиотеки GDI. Контексты GDI и GDI+отличаются от контекста GLUT? В интернете пишут, что раньше было возможно их совместное использование.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Что бы можно было задавать параметры
Это в случае вызова из консоли или любого .exe, написанного на любом ЯП?
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
02.01.2021, 23:40 4
Цитата Сообщение от Argus19 Посмотреть сообщение
пишут, что раньше было возможно их совместное использование.
Не знаю, что там было раньше. Если сможете изменить формат поверхности консольного окна, то сможете и создать контекст OpenGL для него. https://docs.microsoft.com/en-... ixelformat(Внимательно читайте Remarks).
В любом случае мне не понятно, зачем в консоли рисовать и зачем вообще изучать допотопные технологии вроде GLUT...
Цитата Сообщение от Argus19 Посмотреть сообщение
Это в случае вызова из консоли
Да
1
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
02.01.2021, 23:58  [ТС] 5
Цитата Сообщение от zayats80888 Посмотреть сообщение
Внимательно читайте Remarks
Прочитал. Спасибо.
Цитата Сообщение от zayats80888 Посмотреть сообщение
зачем в консоли рисовать
Это для начала. Интересно порисовать на форме и контролах VB 6.0.
Цитата Сообщение от zayats80888 Посмотреть сообщение
зачем вообще изучать допотопные технологии вроде GLUT
GLUT по-сути оболочка для OpenGL и её функции, в отличие от OpenGL, могут вызываться из VB при соответствующих декларациях.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Да
Как быть, если инициализацию надо произвести из оконного приложения, написанного на другом ЯП?
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
03.01.2021, 00:02 6
Цитата Сообщение от Argus19 Посмотреть сообщение
GLUT по-сути оболочка для OpenGL
не верно, glut это всего на всего библиотека создающая окно + контекст, а так же главный цикл и обработку ввода, грубо говоря к opengl имеет косвенное отношение

Добавлено через 1 минуту
Цитата Сообщение от Argus19 Посмотреть сообщение
порисовать на форме
ну так создаете на форме контекст для opengl и рисуете на нем, для opengl возьмите библиотеку glad например
0
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
03.01.2021, 00:05 7
GLUT по-сути оболочка для OpenGL и её функции, в отличие от OpenGL, могут вызываться из VB при соответствующих декларациях
А что функции OpenGL не могут вызываться? С чего это вдруг?
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
03.01.2021, 00:09  [ТС] 8
Цитата Сообщение от The trick Посмотреть сообщение
А что функции OpenGL не могут вызываться? С чего это вдруг?
Читал когда-то, лет 20 назад, что OpenGL нормально работает из-под ASM и С++, а из-под VB 6.0 никак.
0
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
03.01.2021, 00:14 9
Argus19, это неправда.
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
03.01.2021, 00:27  [ТС] 10
Цитата Сообщение от alecss131 Посмотреть сообщение
для opengl возьмите библиотеку glad например
Я только начал читать про библиотеку GLUT и сразу возникли вопросы, не имеющие простой реализации. Не будет ли подобного ( инициализация, создание контекста и отключение) такими же хлопотными, как с GLUT?
Цитата Сообщение от The trick Посмотреть сообщение
это неправда.
Это была то ли статья, то ли книга по DirectX.
Во всяком случае, не встречал проектов на VB 6.0 с использованием OpenGL.
0
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
03.01.2021, 08:55 11
Цитата Сообщение от Argus19 Посмотреть сообщение
Во всяком случае, не встречал проектов на VB 6.0 с использованием OpenGL.
Плохо смотрел.
1
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
03.01.2021, 12:11 12
Цитата Сообщение от The trick Посмотреть сообщение
Плохо смотрел.
Только вот там пример с использованием устаревшей версии opengl, версии 1и 2 являются deprecated и не рекомендуются к использованию, минимум актуальной версии это 3.3 core profile, но имхо лучше использовать 4.5-4.6 (они и так довольно старые, но с ними можно получить производительность уровня вулкана)
glut так же устарел как и 1 версия opengl

Цитата Сообщение от Argus19 Посмотреть сообщение
что OpenGL нормально работает из-под ASM и С++
он нормально работает во всех языках которые могут использовать сишные dll, например java и python без проблем, там даже есть готовые обертки, я активно использую opengl в java.
для vb6 может не быть готовых оберток (особенно свежих версий), но можно написать самому, используя тык1 и тык2. То есть из 2 ссылки механизм, а из первой описание функций, dll в системе есть opengl32.dll, в итоге выйдет аналог glad (который по сути является набором ссылок на функции), только вот с указателями не знаю что будет (получение числа из функции с помощью указателя и передача массива используя * и ** в си), можно даже не все функции реализовывать, а только те которые нужны (например брать их из уроков)

в итоге остается вопрос создания контеста нужной версии, с чем я вряд ли смогу помочь, я использую glfw для контекста. хотя его можно и с помощью winapi создать
1
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
03.01.2021, 12:43 13
Цитата Сообщение от alecss131 Посмотреть сообщение
Только вот там пример с использованием устаревшей версии opengl, версии 1и 2 являются deprecated и не рекомендуются к использованию, минимум актуальной версии это 3.3 core profile, но имхо лучше использовать 4.5-4.6 (они и так довольно старые, но с ними можно получить производительность уровня вулкана)
glut так же устарел как и 1 версия opengl
Это не имеет значения. Возможность есть работы без всяких оберток.
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
06.01.2021, 01:24  [ТС] 14
Цитата Сообщение от The trick Посмотреть сообщение
Плохо смотрел.
Посмотрел примеры на VB. Рисуется не на существующей форме, а создаётся новая с определёнными параметрами.
Была надежда, присвоить консольному окну соответствующий контекст, используя эти примеры, но....
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
06.01.2021, 09:37 15
Цитата Сообщение от Argus19 Посмотреть сообщение
Была надежда, присвоить консольному окну соответствующий контекст, используя эти примеры, но....
Ну раз хотите извращать с консолью, то вот набросал вам пример:
Кликните здесь для просмотра всего текста
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef NOMINMAX
#define NOMINMAX
#endif
 
#include <windows.h>
#include <GL/GL.h>
#include <iostream>
 
#define STR(text) #text
#define winApiCheck(expr, fail) do { if ((expr) == (fail)) checkError(__FILE__, __LINE__, STR(expr)); } while(false)
#define logger(...) getDefaultLogOutput(__VA_ARGS__)
//====================================================================================
std::ostream & getDefaultLogOutput() { return std::cerr; }
 
const char * getErrorStr(DWORD errCode);
 
void checkError(const char * file, int line, const char * expr);
//====================================================================================
class OffscreenSurface
{
public:
    OffscreenSurface();
 
    ~OffscreenSurface();
 
    bool create(HDC hdc, int width, int height);
 
    bool makeCurrent(bool current = true);
 
    void display();
 
    bool blit(HDC hdc, int x = 0, int y = 0);
 
    bool blit(HDC hdc, int x, int y, int width, int height);
 
private:
 
    bool createDeviceCtx(HDC hdc);
 
    bool createSurface(int width, int height);
 
    bool chooseFormat();
 
    bool createContext();
 
    void cleanUp();
    
    HDC m_dc;
    HBITMAP m_dib;
    HGLRC m_rc;
    int m_width;
    int m_height;
    void * m_pixels; 
};
//====================================================================================
int main()
{
    HWND consoleWindow = GetConsoleWindow();
    HDC consoleDC = GetDC(consoleWindow);
    int width = 256;
    int height = 256;
    OffscreenSurface surf;
    if (surf.create(consoleDC, width, height) && surf.makeCurrent())
    {
        std::cout << "press enter to draw triangle...";
        std::cin.get();
 
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_TRIANGLES);
            glColor3ub(0xff, 0x00, 0x00);
            glVertex2f(-1.0f, -1.0f);
            glColor3ub(0x00, 0xff, 0x00);
            glVertex2f(1.0f, -1.0f);
            glColor3ub(0x00, 0x00, 0xff);
            glVertex2f(0.0f, 1.0f);
        glEnd();
 
        surf.display();
        surf.blit(consoleDC);
    }
    ReleaseDC(consoleWindow, consoleDC);
 
    std::cout << "press enter to finish...";
    std::cin.get();
}
//====================================================================================
const char * getErrorStr(DWORD errCode)
{
    switch (errCode)
    {
        case ERROR_INVALID_PIXEL_FORMAT : return STR(ERROR_INVALID_PIXEL_FORMAT);
        case ERROR_NO_SYSTEM_RESOURCES : return STR(ERROR_NO_SYSTEM_RESOURCES);
        case ERROR_INVALID_DATA : return STR(ERROR_INVALID_DATA);
        case ERROR_INVALID_HANDLE : return STR(ERROR_INVALID_HANDLE);
        case ERROR_DC_NOT_FOUND : return STR(ERROR_DC_NOT_FOUND);
        default : return STR(N/A);
    }
}
 
void checkError(const char * file, int line, const char * expr)
{
    auto errCode = GetLastError();
    logger() << "ERROR: " << file << " : " << line << "\n\t"
             << "expression: " << expr << "\n\t"
             << "code: " << errCode << "\n\t"
             << "description: " << getErrorStr(errCode) << '\n';
}
 
OffscreenSurface::OffscreenSurface()
    : m_dc(NULL), m_dib(NULL), m_rc(NULL), m_width(0), m_height(0), m_pixels(NULL)
{
}
 
OffscreenSurface::~OffscreenSurface()
{
    cleanUp();
}
 
bool OffscreenSurface::create(HDC hdc, int width, int height)
{
    cleanUp();
    bool result = createDeviceCtx(hdc);
    result = result && createSurface(width, height);
    result = result && chooseFormat();
    result = result && createContext();
    return result;
}
 
bool OffscreenSurface::makeCurrent(bool current)
{
    bool result = false;
    winApiCheck(result = wglMakeCurrent(m_dc, current ? m_rc : NULL), false);
    return result;
}
 
void OffscreenSurface::display()
{
    glFinish();
}
 
bool OffscreenSurface::blit(HDC hdc, int x, int y)
{
    return blit(hdc, x, y, m_width, m_height);
}
 
bool OffscreenSurface::blit(HDC hdc, int x, int y, int width, int height)
{
    bool result = false;
    winApiCheck(result = BitBlt(hdc, x, y, width, height, m_dc, 0, 0, SRCCOPY), false);
    return result;
}
 
bool OffscreenSurface::createDeviceCtx(HDC hdc)
{
    winApiCheck(m_dc = CreateCompatibleDC(hdc), NULL);
    return m_dc != NULL;
}
 
bool OffscreenSurface::createSurface(int width, int height)
{
    m_width = width;
    m_height = height;
 
    BITMAPINFO bmi;
    ZeroMemory(&bmi, sizeof(bmi));
    BITMAPINFOHEADER &bih = bmi.bmiHeader;
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biWidth = width;
    bih.biHeight = width;
    bih.biPlanes = 1;
    bih.biBitCount = 32;
    bih.biCompression = BI_RGB;
 
    winApiCheck(m_dib = CreateDIBSection(m_dc, &bmi, DIB_RGB_COLORS, &m_pixels, NULL, 0), NULL);
    HGDIOBJ result = NULL;
    if (m_dib)
        winApiCheck(result = SelectObject(m_dc, m_dib), NULL);
    return result != NULL;
}
 
bool OffscreenSurface::chooseFormat()
{
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    int format = 0;
    winApiCheck(format = ChoosePixelFormat(m_dc, &pfd), 0);
    bool result = (format != 0);
    if (result)
        winApiCheck(result = SetPixelFormat(m_dc, format, &pfd), false);
    return result;
}
 
bool OffscreenSurface::createContext()
{
    winApiCheck(m_rc = wglCreateContext(m_dc), NULL);
    return m_rc != NULL;
}
 
void OffscreenSurface::cleanUp()
{
    m_width = m_height = 0;
    if (m_rc != NULL)
    {
        makeCurrent(false);
        winApiCheck(wglDeleteContext(m_rc), FALSE);
        m_rc = NULL;
    }
    if (m_dib != NULL)
    {
        winApiCheck(DeleteObject(m_dib), FALSE);
        m_dib = NULL;
        m_pixels = NULL;
    }
    if (m_dc != NULL)
    {
        winApiCheck(DeleteDC(m_dc), FALSE);
        m_dc = NULL;
    }
}

Сразу скажу, что рендеринг в оперативку медленный, т.е. на производительность анимированной 3D графики можете особо не рассчитывать. (хотя есть способ схитрить, через прозрачное окно поверх консольного и WindowsAero, но там много WinApi писанины будет, я это делать не хочу)
1
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
06.01.2021, 12:13  [ТС] 16
Цитата Сообщение от zayats80888 Посмотреть сообщение
то вот набросал вам пример:
Спасибо. Работает.
Вы не используете функцию glutInit. Как я понимаю, она должна проинициализировать библиотеку. Как же без неё?
0
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
06.01.2021, 12:41 17
Цитата Сообщение от Argus19 Посмотреть сообщение
Была надежда, присвоить консольному окну соответствующий контекст, используя эти примеры
Для чего? Создавай контекст в нормальном окне, тем более используя формы VB6 это очень просто можно сделать.

Цитата Сообщение от Argus19 Посмотреть сообщение
Вы не используете функцию glutInit
Ну вероятно потому что эта функция инициализирует GLUT, а в примере нет GLUT.
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
06.01.2021, 13:20  [ТС] 18
Цитата Сообщение от The trick Посмотреть сообщение
а в примере нет GLUT.
Смутило то, что в приведённом виде программа не заработала. Заработала после добавления заголовка
C++
1
#include <glut.h>
Как я понимаю, glut у меня установлена в системе и подключена в link. Но в заголовочном файле glut.h нет функций, используемых а программе.
0
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
06.01.2021, 13:53 19
Цитата Сообщение от Argus19 Посмотреть сообщение
Смутило то, что в приведённом виде программа не заработала. Заработала после добавления заголовка
Ну вероятно это из-за того что GLUT использует OpenGL поэтому и заработало. Выше же написали - зачем его использовать? Используй OpenGL напрямую. Из VB6 это вообще без проблем можно сделать. Declare и так динамически ресолвит имена.
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
06.01.2021, 16:05  [ТС] 20
Цитата Сообщение от The trick Посмотреть сообщение
Используй OpenGL напрямую. Из VB6 это вообще без проблем можно сделать.
Я не нашёл хоть какого-либо описания как это сделать и поэтому, начал "копать" в сторону С++.
Поиск не находит даже деклараций функций OpenGL. В примерах, ссылку на которые вы дали, используется .tlb. Деклараций нет. Книги по OpenGL для С++.
Казалась бы, нет ничего проще, скачал книгу, почитал и попробовал. За столько лет ни нашлось ни одного автора, чтобы хоть как-то описать использование OpenGL из-под VB 6.0?
0
06.01.2021, 16:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2021, 16:05
Помогаю со студенческими работами здесь

Подскажите или скиньте код примера работы со сканером
Народ мне задание дали работать со сканером. Подскажите или скиньте код примера работы со сканером....

Работа с трехмерными примитивами. Вокруг конуса GLU вращаются сфера GLUT и конус GLUT
создание виртуальной камеры gluLookAt и добавление эффектов анимации. вот само задание Вокруг...

Исходники любой программы для работы с бд состоящей их трех подсистем(для примера)
Поделитесь пожалуйста исходниками любой программы по работе с бд, желательно чтобы было 3...

Glut c#
Здравствуйте товарищи помогите пожалуйста запустить opengl glut на c#. Добавлено через 1 час 24...

GLUT
ПОдскажите пожалуйста хорошие уроки......просто сколько ищу в нете ничего толкого не нашел........

GLUT
Всем доброго времени суток!Я хотел бы у вас поинтересоваться,какой номер в GLUT соответствует...


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

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