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

Пример в C++

06.12.2012, 17:08. Показов 5194. Ответов 16

Студворк — интернет-сервис помощи студентам
Решил изучить OpenGL более тщательно, так сказать с самого начала, чтобы лучше понимать то, что буду учить дальше. Но OpenGL я понимаю очень плохо. Нашел простой пример:

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
#include <gl\glut.h> 
 
void Draw() 
{ 
 glClear(GL_COLOR_BUFFER_BIT); 
 glColor3f(0.0, 1.0, 0.0); 
 glBegin(GL_POINTS); 
  glVertex2f(0.0, 0.0); 
 glEnd(); 
 glFlush();//только для GLUT_SINGLE 
} 
 
void Initialize() 
{ 
 glClearColor(1.0, 0.0, 0.0, 1.0); 
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity(); 
 glOrtho(-200.0, 200.0, -200.0, 200.0, -5.0, 5.0); 
} 
 
int main(int argc, char** argv) 
{ 
 //Инициализация 
 glutInit(&argc, argv); 
 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
 glutInitWindowSize(400, 400); 
 glutInitWindowPosition(100, 200); 
 glutCreateWindow("Lesson 01"); 
 
 //Регистрация 
 glutDisplayFunc(Draw);//Рисование 
 Initialize(); 
 glutMainLoop(); 
 return 0; 
}
Я не сильно понимаю, в каком порядке вызывается какая функция
Сразу видимо срабатывает main автоматом
glutInit(&argc, argv); - Зачем эта строка я так и не понял, ведь по сути в main ничего не передается. Я даже не понял, зачем в функции main параметры. Как я понял, main запускается автоматически и в данном случае без параметров

C++
1
glutDisplayFunc(Draw);
Эту строку я тоже не понял. Что-то вроде объявления функции рисования. Но я не нашел, где ее запуск происходит.
Зачем так писать? Почему бы просто не вызвать ее, как вызывается Initialize();?

Подскажите пожалуйста...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2012, 17:08
Ответы с готовыми решениями:

Пример vgl.h
Bin помещается в пути по переменной среды PATH, lib помещается в пути по переменной среды LIB, include помещается в пути по переменной...

Пример теней c#
Добрый день, буду рад Вашей помощи, нужен исходник куба 3д, или другой простой фигуры, с реализовано тенью. Желательно на c#. Спасибо

Ищу пример
Нужно сделать сферу, вокруг которой будет крутится другая сфера. Если кто встречал подобный пример - поделитесь пожалуйста. Чем легче и...

16
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 304
06.12.2012, 20:26
glutInit(&argc, argv); Проводит инициализацию контекста OpenGL, лучше не думать как это происходит Просто вызывать и не задумываться...
glutDisplayFunc Принимает в качестве параметра функцию, которая будет вызыватся каждый раз, при перерисовке графики. Вместо Draw может быть любая функция, с любым именем...
0
1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
06.12.2012, 23:49  [ТС]
Когда будет срабатывать эта перерисовка? Мне вообще говорили, что glutDisplayFunc(Draw); добавляет функцию Draw куда-то, а после этого с помощью строки glutMainLoop(); -функция Draw выполняется непрерывно, пока не закроется окно. Это верно?
0
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 304
07.12.2012, 05:25
В какой-то мере да, но ведь программа работает в оконной среде... И когда окно свёрнуто или не активно, то перерисовка не нужна...
glutMainLoop(); запускает основной цикл программы, по сути внутри есть вызов функции Draw.
0
387 / 214 / 102
Регистрация: 09.04.2012
Сообщений: 635
07.12.2012, 07:03
Проводит инициализацию контекста OpenGL, лучше не думать как это происходит Просто вызывать и не задумываться...
Нет, это неправильный подход к программированию.

glutInit(&argc, argv); - Зачем эта строка я так и не понял, ведь по сути в main ничего не передается.
Оно может передаваться. В командной строке могут быть заданы параметры работы программы. Если main запускается без параметров,то в первой элементе массива argv находится название исполняемого файла программы, а значение argc составляет 1.

Добавлено через 12 минут
Эту строку я тоже не понял. Что-то вроде объявления функции рисования. Но я не нашел, где ее запуск происходит.
Зачем так писать? Почему бы просто не вызвать ее, как вызывается Initialize();?
Так как в Windows особая модель исполнения. Время процессора распределяется ядром ОС между разными процессами. Ядро операционной системе передает ненадолго управление процессу и затем забирает обратно. Вроде бы у Руссиновича в книге Windows Internals описывается модель ядра Windows, где об этом можно почитать подробнее, чем я смогу изложить на форуме. А подробности системного программирование вроде бы есть у Рихтера Advanced Windows.

Сообщение между ядром (kernel) Windows и программой осуществляется посредством сообщений ( messages). У прораммы для windows существует очередь сообщений (message queue), в которой указаны параметры wparam и lparam.

Обработкой сообщений в программе занимается оконная процедура, которую не программа вызывает, а которую вызывает сама операционная система. То есть это CALLBACK функция ( функция обратного вызова). Эту функцию нельзя вызвать напрямую, так как вызовов занимается ядро операционной системы. Подробно у Петцолда в книге Programming Windows.

Сообщения это например оповещение о закрытии окна ( WM_DESTROY), о создании окна ( WM_CREATE), об изменении размеров ( WM_SIZE), об отрисовке ( WM_PAINT) и т.п.

Таким образом функцию отображения для OpenGL вызывает ядро Windows. А управление оконной процесдурой берет на себя OpenGL, то есть в нем должна присутсвовать цикл получения сообщений функциями GetMessage, TranslateMessage, DispatchMessage. и OpenGL вызывает функцию отображения, в данном случае Draw, при передаче ядром системы управления программе.

Добавлено через 5 минут
Вот названия книг:
- Solomon, David; Russinovich, Mark (September 16, 2000). Inside Microsoft Windows 2000 (Third ed.). Microsoft Press. - Russinovich, Mark; Solomon, David (December 8, 2004). Microsoft Windows Internals (Fourth ed.). Microsoft Press. Russinovich, Mark; Solomon, David; Ionescu, Alex (June 17, 2009). Microsoft Windows Internals (Fifth ed.).
- Jeffrey Richter - Advanced Windows Third Edition (February 1997)
Charles Petzold - Programming Windows, 4th edition (Microsoft Press, 1996)
0
1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
07.12.2012, 12:31  [ТС]
На счет перерисовки: В MFC у меня уже реализована перерисовка, возможно мне не нужно использовать
glutMainLoop(); Раньше я обходился и без этого, при изменении окна все работало нормально.

Вот у меня есть проблема:
В этом первом уроке описывается пример, в котором есть функция main c необходимыми параметрами, которая вызывается автоматически при запуске программы.
А как быть, если я делаю в шаблоне MFC? У меня функция, которая имеет такой же код, как main, должна выполнятся при нажатии на какую-то кнопку.
То есть не при запуске программы, а в необходимый момент. По скольку я явно не вижу, какие там параметры передаются в main и т.д. я не могу сделать запуск программы без main. Допустим я в свою функцию CPicture::OnShowPicture() , которая срабатывает при нажатии кнопки, запишу схожий с функцией main код. В таком случае glutInit(&argc, argv); не примет параметры. Как быть?
0
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 304
07.12.2012, 12:40
Цитата Сообщение от asidorchenko Посмотреть сообщение
Нет, это неправильный подход к программированию.
То есть, я должен понимать, что там внутри происходит? Но мир не ограничен ОС Windows, есть Linux, BSD, ...
И я должен разбираться, что там внутри происходит? На кой тогда вообще нужны библиотеки, для инициализации OpenGL?
Нет, лучше не лезть туда, куда мне не надо, а делать то что интересно или требуется...

И причём тут Windows и его ядро? Ведь GLUT можно использовать не только под Windows, есть кстати альтернатива freeGLUT.


Короче я не совсем согласен....
0
1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
07.12.2012, 22:05  [ТС]
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
void CSphereView::Initialize()
{
    glClearColor(1.0, 0.0, 0.0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-200.0, 200.0, -200.0, 200.0, -5.0, 5.0); 
}
 
void static Draw()
{
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0, 1.0, 0.0); 
    glBegin(GL_POINTS); 
    glVertex2f(0.0, 0.0); 
    glEnd(); 
    glFlush();//только для GLUT_SINGLE 
}
 
void CSphereView::OnButtonClick()
{
    char *str="progname";
    int argc=1;
    char **argv;
    *argv=str;
 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowSize(400, 400); 
    glutInitWindowPosition(100, 200); 
    glutCreateWindow("Lesson 01"); 
 
    //Регистрация 
    glutDisplayFunc(CSphereView::Draw);//Рисование 
    Initialize(); 
    glutMainLoop(); 
}
Компилятор выдает
error LNK2019: unresolved external symbol "public: static void __cdecl CSphereView:raw(void)" (?Draw@CSphereView@@SAXXZ) referenced in function "public: void __thiscall CSphereView::OnButtonClick(void)" (?OnButtonClick@CSphereView@@QAEXXZ)

error LNK1120: 1 unresolved externals

В чем ошибка?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
08.12.2012, 14:52
То есть, я должен понимать, что там внутри происходит? Но мир не ограничен ОС Windows, есть Linux, BSD, ...
Ты даже основ C++ не знаешь судя по вопросам, займись сначала ими.
В какой-то мере да, но ведь программа работает в оконной среде... И когда окно свёрнуто или не активно, то перерисовка не нужна...
display функция вызывается только при необходимости, постоянной перерисовки вообще не происходит, если не вызывать glutPostRedisplay на каждом кадре.
И display не может быть "любой" функцией, а лишь функцией с правильной сигнатурой.
0
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 304
08.12.2012, 15:51
Цитата Сообщение от Герц Посмотреть сообщение
Ты даже основ C++ не знаешь судя по вопросам, займись сначала ими.
Что-то я потерял нить беседы... Как основы С++ связаны с инициализацией приложения в оконной операционной системе?
Тут скорее архитектура ОС, чем основы С++?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
08.12.2012, 20:10
Человек не понимает, откуда вызывается функция main и как ей передаются параметры, не понимает, зачем glutDisplayFunc принимает функцию в виде параметра. Тут нужно сначала с языком разбираться, хотя бы в общих чертах, понять что такое указатель на функцию и прочая.
0
 Аватар для Ka3ax
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 4
11.12.2012, 01:09
C++
1
2
3
4
5
6
7
#include <GL/glut.h>
int main(int argc, char** argv)
{
glutInit(&argc, argv);
// далее инициализация glut параметров
return 0;
}
тот же код, что в первом посте, но ошибка при компиляции
использую DEVC++ 4.9.9.2, ошибки"
1. L/glut.h: No such file or directory. "
2. n function `int main(int, char**)':
3. lutInit' undeclared (first use this function)

пробовал glutInit(&__argc, __argv);добавляется ошибка
argc' undeclared (first use this function)

в Microsoft Visual C++ 6.0 вышеприведенный код так же ведет к ошибке
"fatal error C1010: unexpected end of file while looking for precompiled header directive"
и указывает на строку кода, точнее на строку ниже последних закрывающих скобок.

в каталоге C:\Dev-Cpp\lib имеются библиотеки "своей" упаковки, в частности libglut32.a
там же libgl.a, с ней, библиотекой, пример из каталога SAMPLE работает.

мне бы настроить DEV или MVC++ на работу с glut.h.
0
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 304
11.12.2012, 10:41
Файл glut.h не находит. В первом случае.

Настроить помочь не могу, нет этих IDE по линуксом...
1
 Аватар для Ka3ax
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 4
12.12.2012, 00:21
Цитата Сообщение от SEvg Посмотреть сообщение
Файл glut.h не находит. В первом случае.
я уже glut32.dll и рядом с cpp клал, и в системный каталог закидывал. регистрировал в системе...
может еще и glut не глут. поищу другой.
автор уроков по OpenGL(многие с таким же столкнулись) рекомендовал в папку проекта помещать.
Нужно просто dll библиотеки (glut32.dll и другие, если требуется) положить в папку с приложением. Я тестировал его на сотне с лишним компов (на форуме одном выложил), никто не жаловался на "не запуск".
но мой MVCpp чего то не хочет также работать.

Добавлено через 1 час 19 минут
ps
прояснилось с DEVpp, его пока пытаюсь запустить.
пока dll ка не нужна. нужен хедер glut.h. его у
авторов на сайте нашел, но в нем нет функций которые в уроке
применяются. но в его теле еще два файла подключаются....
если связи все прослеживать, жизни не хватит.
вот так и учись, то сего нет, то другое отсутствует
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
12.12.2012, 10:07
Freeglut скачай, затыкаясь на заголовочниках далеко в обучении не продвинешься, нужно повышать общую грамотность с c++
1
 Аватар для Ka3ax
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 4
12.12.2012, 23:31
Цитата Сообщение от Герц Посмотреть сообщение
Freeglut скачай, затыкаясь на заголовочниках далеко в обучении не продвинешься, нужно повышать общую грамотность с c++
книги читать?
там нет как настраивать дев
и второе, нужно сразу начинать программы составлять, смотреть
чужие. без этого книга ничто.
не моя вина, что редакторы не настроены. я не кодер, я программист.
и мне cpp, только на реализацию одной задачи нужен. не нужно здесь речей
о повышении уровня знаний.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
12.12.2012, 23:41
Ну как знаешь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2012, 23:41
Помогаю со студенческими работами здесь

Простейший пример с OpenGL (C++)
Дайте пример простейшей программы с использованием OpenGL которая рисовала бы например круг. (Напишите пожалуйста со всеми Include'ами)

Пример файла из 3dmax
Здравствуйте. Нет ли у кого примера файла для загрузки в opengl простенькой геометрии с парой текстур. У меня пока нет 3dmax, хотелось бы...

Простейший пример с комментариями
Всем доброго времени суток! Моя просьба заключается в следующем: так как я полный новичок в OpenGl и пока абсолютно всё для меня ново...

Простой пример OpenGL
Здравствуйте! У меня Visual C++ 6. Так вот. У меня не запускаются не один пример OpenGL, дайте мне пожалуйста маленький пример для OpenGL,...

Пример использования VAO + VBO
Добрый день. Поделитесь примером использования VAO + VBO, которые реализованы не на WinAPI. Желательно, чтобы я мог задавать координаты...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru