Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239

Кроссплатформенный стиль кода

03.04.2019, 22:42. Показов 6595. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго здравия!

Ни когда раньше не писал кроссплатформенные приложения, и даже не знаю как писать под (например) линукс. Всегда работал только под виндой. Так вот, решил написать шаблон приложения, универсальный с подключением 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
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
#ifdef _DEBUG
#define CONSOLE
#define WINDFUNC main()
#else
#define WINDOWS
#define WINDFUNC WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, LPTSTR lpCmdLine, INT iCmdShow)
#endif
 
#include "globals.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINDFUNC {
    std::string error = g_error + "MAIN::";
 
    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(0, IDI_APPLICATION);
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = TEXT("Test");
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hInstance = (HINSTANCE)GetModuleHandleW(0);
 
    if (!RegisterClassEx(&wc)) {
        logg.out("%s reg class", error.c_str());
        return 0;
    }
 
    HWND hwnd = CreateWindowEx(
        0,
        wc.lpszClassName,
        TEXT("Test"), WS_OVERLAPPEDWINDOW,
        800, 100,
        500, 500,
        0, 0, wc.hInstance, 0
    );
    if (!hwnd) {
        logg.out("%s create window", error.c_str());
        return 0;
    }
 
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
 
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
    switch (msg) {
    case WM_DESTROY: PostQuitMessage(0); break;
 
    default: return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return 0;
}

и прежде чем продолжить, встал вопрос: А как мне код оформить так, чтобы если я передам свой код человеку который работает на другой платформе, он мог спокойно, не плюясь в меня переписать/дополнить главные функции инициализации окон не переписываю всю программу?
Т.к. у меня даже опыта нет написания кода под другие платформы, то хочется свой код под мою платформу как-то грамотно обернуть, что-то типа, вынести всё что касается моей платформы в отдельные функции/класс и в точке входа прописать типа: initWin() (например)

Я понимаю, что существуют кроссплатформенные библиотеки, но т.к. я только учусь, то хотелось бы самому научиться грамотно оборачивать код. В общем буду рад услышать все советы по оформлению кода, что куда вынести и т.д.

P.S. Понимаю, что у некоторых возникнет вопрос, а для чего в режиме дебаг консольное, а релизе виндовое приложение, сразу отвечу, где-то прочитал идею о том, чтобы в режиме дебаг дополнительно выводить для себя логи ещё и в консоль, мне эта идея понравилась и решил её реализовать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2019, 22:42
Ответы с готовыми решениями:

Проектная структура и стиль кода
Доброго времени суток. Имея опыт программирования на других языках, я наконец решился окунуться в пучину C++. С языком вроде как не...

Стиль написания кода(читабельность и прочее)
Недавно делал тестовое задание для поиска работы, но мне сказали, что код не совсем корректно написан. Задание:Написать рекурсивный и не...

Синглтон и стиль написания кода (теория)
В общем, тут диспут о правильном написании кода. Я знаю что такое синглтон, для чего он нужен и как реализуется. Однако меня...

56
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
04.04.2019, 11:56  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 8Observer8 Посмотреть сообщение
SDL2, SFML
На сколько я понял, эти библиотеки в основном заточены для 2D графики?
а GLFW больше ориентирован на OpenGL 3.3+ т.е. конкретно для создания контекста?
По сути, что я хочу, для меня библиотека нужна для создание кросплатформенного окна, подключения контекста OpenGL 3.3+ и взаимодействия с ОС, желательно ещё реализация загрузки текстур и работа со звуком, вот для этих целей что лучше подойдет?
Для работы с матрицами не плохо подходит GLM, плюс у них есть реализации различных шумов и т.п.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
04.04.2019, 12:07
Цитата Сообщение от Avaddon74 Посмотреть сообщение
А как мне код оформить так, чтобы если я передам свой код человеку который работает на другой платформе
Конкретно ваш код - никак.
Он у вас платформо-специфичный.
Такое в принципе не взлетит нигде кроме винды.

Цитата Сообщение от Avaddon74 Посмотреть сообщение
хочется свой код под мою платформу как-то грамотно обернуть, что-то типа, вынести всё что касается моей платформы в отдельные функции/класс
Так это обычно и делается.

Идея простая:
Снаружи видно только какие то платформо-независимые интерфейсы.
Никакие #include<windows.h> ни в каких публичных хэдерах не отсвечивают.

Вся платформо-специфичная начинка скрывается в недрах спп файлов.
В зависимости от платформы под которую осуществляется сборка,
те, или иные детали могут включаться/исключаться из компиляции.
Это может быть на уровне файлов (конфигурируется системой сборки)
Или на уровне отдельных фрагментов кода (конфигурируется через макросы препроцессора)

Цитата Сообщение от Avaddon74 Посмотреть сообщение
шаблон приложения, универсальный с подключением OpenGL, набросал пока немного кода, только инициализацию и создание окна:
Посмотрите как это сделано в библиотеке GLUT.

Она как раз предоставляет кроссплатформенное окошко + opengl.

Причем не нужно пытаться вникнуть в то, как GLUT реализована изнутри.
Посмотрите на то, какие она предоставляет интерфейсы.
Как они оформлены.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 12:16
Цитата Сообщение от Avaddon74 Посмотреть сообщение
GLFW больше ориентирован на OpenGL 3.3+ т.е. конкретно для создания контекста?
Конкретно для создания окон и OpenGL/ES/Vulcan контекста.
Цитата Сообщение от Avaddon74 Посмотреть сообщение
OpenGL 3.3+
Точнее на OpenGL 3.0+.
Цитата Сообщение от Avaddon74 Посмотреть сообщение
По сути, что я хочу, для меня библиотека нужна для создание кросплатформенного окна, подключения контекста OpenGL 3.3+ и взаимодействия с ОС
GLFW тут идеально подходит.
Но кроме него, вам еще нужен "лоадер", т.к. функции OpenGL должны выполняться в рантайме/динамически.
На эту роль тянет glad.
Только вмессте вы сможете использовать OpenGL.
В SDL и SFML там уже все сделано за вас, но они и весят больше и со 100% вероятностью не покроют ваши потребности, т.к. они менее гибкие в плане настройки под вас.
Цитата Сообщение от Avaddon74 Посмотреть сообщение
На сколько я понял, эти библиотеки в основном заточены для 2D графики?
В SDL можна и 3д делать.
Цитата Сообщение от Avaddon74 Посмотреть сообщение
желательно ещё реализация загрузки текстур и работа со звуком, вот для этих целей что лучше подойдет?
В SDL и SFML есть такой функционал, но опять же, а подходит ли он вам?
Потом уже поменять не получится.
Т.е. либо юзаем GLFW + glad и сами пишем/выбираем удобные для нас загрузчики и работу со звуком.
На самом деле с GLFW и glad'a можно самому выбросить то что не используешь.
Или SDL/SFML - где уже как бы есть все готовое.
1
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,961
Записей в блоге: 216
04.04.2019, 12:31
My Original Message in English

Цитата Сообщение от Avaddon74 Посмотреть сообщение
На сколько я понял, эти библиотеки в основном заточены для 2D графики?
Yes, but you can use them like GLFW: for creating window and for handling keyboard/mouse events.

Цитата Сообщение от Avaddon74 Посмотреть сообщение
желательно ещё реализация загрузки текстур и работа со звуком, вот для этих целей что лучше подойдет?

You can find Russian translations of these lessons here: learnopengl. Урок 1.1 — OpenGL / Хабр - Habr


Translate Google Result:

Цитата Сообщение от Avaddon74 Посмотреть сообщение
На сколько я понял, эти библиотеки в основном заточены для 2D графики?
Да, но вы можете использовать их как GLFW: для создания окна и для обработки событий клавиатуры / мыши.

Цитата Сообщение от Avaddon74 Посмотреть сообщение
желательно ещё реализация загрузки текстур и работа со звуком, вот для этих целей что лучше подойдет?
  • Текстуры. SOIL, stb_image.h, loadPNG. Мне нравится stb_image.h. Вы можете начать использовать stb_image.h здесь: https://learnopengl.com/Getting-started/Textures
  • Аудио. OpenAL, irrKlang. Вам нужно начать с irrKlang. Вы не можете использовать бесплатную версию irrKlang для коммерческих проектов, но это хорошо для начала. На следующем шаге лучше использовать OpenAL. Вы можете начать с irrKlang здесь: https://learnopengl.com/In-Practice/2D-Game/Audio
  • 3D model loader. Assimp is the best: https://learnopengl.com/Model-Loading/Assimp

Вы можете найти перевод этих уроков на русский язык здесь: learnopengl. Урок 1.1 — OpenGL / Хабр - Habr
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
04.04.2019, 13:43  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Текстуры. SOIL, stb_image.h, loadPNG.
Аудио. OpenAL, irrKlang.
3D model loader. Assimp
Нет, это понятно что на всё есть отдельные библиотеки, я же имею ввиду для моих нужд есть одна библиотека?
Понятно, что можно подключить GLFW + GLM + ... + SOIL и т.д.
А я имею ввиду по типу SFML но с поддержкой OpenGL 3+ и для 3D
Если таких нет библиотек, ну тогда буду использовать несколько разных, в этом проблем нет, просто я всех библиотек не знаю вот и советуюсь, потому что через поиск под свои нужды одну библиотеку охватывающую всё - я не нашел
А по сути то нужно, создание окна, подключение OpenGL обработка клавиш/мыши ну и работа с внешними ресурсами текстуры/звук. Мне даже не нужны всякие там встроенные примитивы, даже вывод текста не важен, т.к. я это всё сам могу реализовать. А вот кросплатформенное приложение я не могу создать Для этого и нужна библиотека

Добавлено через 10 минут
Цитата Сообщение от Azazel-San Посмотреть сообщение
На эту роль тянет glad.
я glew использовал, если правильно понял о чем вы
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.04.2019, 13:45
Цитата Сообщение от Avaddon74 Посмотреть сообщение
А я имею ввиду по типу SFML но с поддержкой OpenGL 3+ и для 3D


Почему не взять 3D-движок? Например OGRE?
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 13:46
Цитата Сообщение от Avaddon74 Посмотреть сообщение
я glew использовал, если правильно понял о чем вы
Ну, можно и glew
1
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,961
Записей в блоге: 216
04.04.2019, 14:02
My Original Message in English

Цитата Сообщение от Avaddon74 Посмотреть сообщение
Нет, это понятно что на всё есть отдельные библиотеки, я же имею ввиду для моих нужд есть одна библиотека?
Yes, you can use SFML or SDL2 that have functionality for: loading images, working with audio files, creating network games. I prefer to study Winsock (WinAPI Network) for multiplayer. Winsock is for Windows only but the principles of sockets is the same everywhere. You can use this functionality + drawing in 3D using OpenGL 3+. But SFML and SDL2 do not have functionality for loading 3D models and skeletal animations. Assimp allows to load them from different formats. You do not need to spend your time to write your own loaders of 3D models and skeletal animations from different formats. Assimp is a cross-platform instrument too.


Translate Google Result:

Цитата Сообщение от Avaddon74 Посмотреть сообщение
Нет, это понятно что на всё есть отдельные библиотеки, я же имею ввиду для моих нужд есть одна библиотека?
Да, вы можете использовать SFML или SDL2, которые имеют следующие функции: загрузка изображений, работа с аудиофайлами, создание сетевых игр. Я предпочитаю изучать Winsock (сеть WinAPI) для мультиплеера. Winsock предназначен только для Windows, но принципы сокетов везде одинаковы. Вы можете использовать эту функциональность + рисование в 3D, используя OpenGL 3+. Но SFML и SDL2 не имеют функциональности для загрузки 3D-моделей и скелетной анимации. Assimp позволяет загружать их из разных форматов. Вам не нужно тратить время на написание собственных загрузчиков 3D-моделей и скелетной анимации из разных форматов. Assimp тоже кроссплатформенный инструмент.

Цитата Сообщение от Avaddon74 Посмотреть сообщение
я glew использовал
Мне нравится современный загрузчик GLAD, в котором требуется включить в проект только два файла: "glad.h" и "glad.c"
I like the modern GLAD loader that requires to include to a project only two files: "glad.h" and "glad.c".
2
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 14:06
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Мне нравится современный загрузчик GLAD, в котором требуется включить в проект только два файла: "glad.h" и "glad.c"
Я так же писал о
Цитата Сообщение от Azazel-San Посмотреть сообщение
На эту роль тянет glad.
Но я считаю обсуждение glad vs glew выходит за рамки этой темы.
Поэтому выбор оставим за ТС
2
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
04.04.2019, 14:25  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему не взять 3D-движок?
Готовый движок, это слишком высокий уровень абстракции. Я же себе цель ставлю наоборот, обучиться, а не абстрагироваться от внутренностей. Я хочу писать на чистом OpenGL, но что бы мои работы были переносимыми, а т.к. я не знаю другие платформы вот и подбираю поэтому библиотеку. Поверхностно то конечно можно пробежаться и по линукс и по маку, но я себе не ставлю целью изучить все платформы.

Добавлено через 2 минуты
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Мне нравится современный загрузчик GLAD
Мне им просто ещё не доводилось пользоваться, обязательно попробую.

Добавлено через 3 минуты
Ну, в общем, я вас всех услышал и понял! Осталось только определиться с конкретными своими желаниями

Добавлено через 10 минут
eva2326, Спасибо за советы, хороший пост, но почему-то не могу ваш ответ добавить к лучшему, может лимит исчерпан?!
1
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
04.04.2019, 14:38
Цитата Сообщение от Azazel-San Посмотреть сообщение
Но кроме него, вам еще нужен "лоадер", т.к. функции OpenGL должны выполняться в рантайме/динамически.
А можно подробнее, что за лоадер и зачем он нужен? Как-то всегда вызывал функции напрямую и они работали, что openGL1, что 3. С какого места начнутся проблемы?
Цитата Сообщение от Azazel-San Посмотреть сообщение
В SDL и SFML там уже все сделано за вас, но они и весят больше и со 100% вероятностью не покроют ваши потребности, т.к. они менее гибкие в плане настройки под вас.
Такой же вопрос. Чего именно не хватает в SDL и SFML?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.04.2019, 14:48
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С какого места начнутся проблемы?
Когда начнете использовать OpenGL Extensions
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 14:52
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Как-то всегда вызывал функции напрямую и они работали, что openGL1, что 3. С какого места начнутся проблемы?
Ну, OpenGL это лишь спецификация, это не библиотека какая-то.
Это означает, что фактическая реализация API варьируется в зависимости от аппаратного обеспечения графического процессора, операционной системы и установленного графического драйвера.
Спецификация OpenGL имеет множество различных функций, определенных в ней, и спецификация OpenGL периодически обновляется. Ваша видеокарта может не поддерживать сама по себе (и не объязана это делать) все эти функции. Здесь и начинаются проблемы.
Это причина того, почему все функции OpenGL статически не объявляются в заголовочном файле. Кроме того, статическая связь с библиотекой невозможна, потому что конечные машины с вероятностью 99% будут иметь сильно различающийся набор реализаций OpenGL.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чего именно не хватает в SDL и SFML?
Например, мне мне показалось что я хочу грузить текстуры иначе, чем это делают они, придется костылить.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
04.04.2019, 15:35  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А можно подробнее, что за лоадер и зачем он нужен?
Вам уже ответили, но дополню. Вы наверно привыкли работать со стандартным OpenGL, типа: glBegin, glVertex, glTransform и т.д. Но это очень ограниченные возможности, которые не позволяют реализовать многое из задуманного. Поэтому разработчики решили предоставить полный доступ к возможностям видеокарт, и появился расширенный OpenGL, в нем уже старые функции не работают, а появляется возможность получить адреса всех новых расширений (функций) прямо из драйвера в режиме рантайм и работать напрямую и с шейдерами и с адресным пространством видяхи, а производители выкладывают расширения которые доступны в этой версии. Вот список всех этих расширений и проверку возможности их использования и объединили в библиотеку, которая упрощает загрузку их, т.е. получения адреса функции.

Для примера разницы между обычным и расширенным OpenGL: раньше я сцену формировал каждый кадр в циклах вызовами glVertex и тому подобное реализую большую часть логики на стороне CPU. в расширенном же можно работать напрямую с буферами, а обработку текстур света и матриц запихать в шейдеры, т.е. я разово подготавливал вершины большинства объектов в сцене и грузил сотни тысяч вершин в буфер, всё остальное уже делалось на стороне GPU, а удалять/добавлять вершины я могу напрямую в буфере не перезакачивая целиком все вершины, хотя и для этого есть удобные и быстрые механизмы. В результате скорость в моем приложении возросла многократно, снизив нагрузку на CPU.

Ну как-то так, объяснил как смог
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.04.2019, 15:45
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Вы наверно привыкли работать со стандартным OpenGL, типа: glBegin, glVertex, glTransform и т.д.
В новых версиях это вообще не стандартно уже.
ЕМНИП, то в OpenGL 3 они deprecated, а в OpenGL 4 совсем выпилены.
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,961
Записей в блоге: 216
04.04.2019, 16:43
My Original Message in English

Цитата Сообщение от Avaddon74 Посмотреть сообщение
Мне им просто ещё не доводилось пользоваться, обязательно попробую.
It is very simple:
  • Go to the website: https://glad.dav1d.de/
  • Select a required version of OpenGL, for example: OpenGL 3.1, Core
  • Press the "Generate" button at the bottom-right corner
  • Add "glad.h" and "glad.c" in your project

This is the example "EmptyWindow" in VS2015 that uses GLFW, GLAD, OpenGL 3.1: EmptyWindow_GlfwOpenGL31Cpp.zip Try download and run it immediately, but, if you use another version of VS, select your "Platform Toolset".

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
#include <glad/glad.h>
#include <GLFW/glfw3.h>
 
int main()
{
    // Initialization
    glfwInit();                     // Initialize the GLFW library
                                    // Create a window
    GLFWwindow *window = glfwCreateWindow(256, 256, "Empty Window", nullptr, nullptr);
    glfwMakeContextCurrent(window); // Create OpenGL context for drawing
    gladLoadGL();                   // Initialize the GLFW library
 
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // Set a color for clearing a canvas
 
    // Run the render loop
    while (!glfwWindowShouldClose(window))
    {
        // Check if any events have been activiated
        // (key pressed, mouse moved etc.) and call
        // corresponding response functions
        glfwPollEvents();
 
        glClear(GL_COLOR_BUFFER_BIT);   // Clear the canvas with the color
        glfwSwapBuffers(window);        // Swap the front and back buffer
    }
 
    // Destroy all GLFW library things: windows and so on
    glfwTerminate();
 
    return 0;
}
Название: EmptyWindow_GlfwOpenGL31Cpp.png
Просмотров: 43

Размер: 1.8 Кб


Translate Google Result:

Цитата Сообщение от Avaddon74 Посмотреть сообщение
Мне им просто ещё не доводилось пользоваться, обязательно попробую.
Это очень просто:
  • Перейдите на сайт: https://glad.dav1d.de/
  • Выберите необходимую версию OpenGL, например: OpenGL 3.1, Core
  • Нажмите кнопку «Generate» в правом нижнем углу
  • Добавьте в свой проект «glad.h» и «glad.c»

Это пример «EmptyWindow» в VS2015, который использует GLFW, GLAD, OpenGL 3.1: EmptyWindow_GlfwOpenGL31Cpp.zip Попробуйте загрузить и запустить его немедленно, но, если вы используете другую версию VS, выберите свой «Набор инструментов платформы» («Platform Toolset»)

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
#include <glad/glad.h>
#include <GLFW/glfw3.h>
 
int main()
{
    // Initialization
    glfwInit();                     // Initialize the GLFW library
                                    // Create a window
    GLFWwindow *window = glfwCreateWindow(256, 256, "Empty Window", nullptr, nullptr);
    glfwMakeContextCurrent(window); // Create OpenGL context for drawing
    gladLoadGL();                   // Initialize the GLFW library
 
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // Set a color for clearing a canvas
 
    // Run the render loop
    while (!glfwWindowShouldClose(window))
    {
        // Check if any events have been activiated
        // (key pressed, mouse moved etc.) and call
        // corresponding response functions
        glfwPollEvents();
 
        glClear(GL_COLOR_BUFFER_BIT);   // Clear the canvas with the color
        glfwSwapBuffers(window);        // Swap the front and back buffer
    }
 
    // Destroy all GLFW library things: windows and so on
    glfwTerminate();
 
    return 0;
}
Название: EmptyWindow_GlfwOpenGL31Cpp.png
Просмотров: 43

Размер: 1.8 Кб
1
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,961
Записей в блоге: 216
04.04.2019, 17:24
My Original Message in English

Цитата Сообщение от Avaddon74 Посмотреть сообщение
Поверхностно то конечно можно пробежаться и по линукс и по маку, но я себе не ставлю целью изучить все платформы.
How will you create executable files of your projects for Mac and Linux? You will install these operating systems on VirtualBox?


Translate Google Result:

Цитата Сообщение от Avaddon74 Посмотреть сообщение
Поверхностно то конечно можно пробежаться и по линукс и по маку, но я себе не ставлю целью изучить все платформы.
Как вы будете создавать исполняемые файлы ваших проектов для Mac и Linux? Вы будете устанавливать эти операционные системы на VirtualBox?
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
04.04.2019, 17:25
Цитата Сообщение от Croessmah Посмотреть сообщение
Когда начнете использовать OpenGL Extensions
То есть подстраиваться под какую-то конкретную видеокарту?
Цитата Сообщение от Azazel-San Посмотреть сообщение
Здесь и начинаются проблемы.
Это причина того, почему все функции OpenGL статически не объявляются в заголовочном файле.
То есть то, что я использовал glew это оно и есть. Понятно.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Кроме того, статическая связь с библиотекой невозможна, потому что конечные машины с вероятностью 99% будут иметь сильно различающийся набор реализаций OpenGL.
На самом деле странно, что не встроили функционал поиска динамической библиотеки по принципу трамплина, а возложили это на сторонние средства. Ну да ладно, наверное у них были на то причины.
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Вы наверно привыкли работать со стандартным OpenGL, типа: glBegin, glVertex, glTransform и т.д.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
что openGL1, что 3
Цитата Сообщение от Avaddon74 Посмотреть сообщение
появляется возможность получить адреса всех новых расширений (функций) прямо из драйвера в режиме рантайм
Нельзя же полагаться только на расширения. Есть еще и стандартные функции вроде той же работы с шейдерами, и они должны быть реализованы во всех драйверах, поддерживающих GL3.
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,961
Записей в блоге: 216
04.04.2019, 19:37
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Это пример «EmptyWindow» в VS2015, который использует GLFW, GLAD, OpenGL 3.1: EmptyWindow_GlfwOpenGL31Cpp.zip Попробуйте загрузить и запустить его немедленно, но, если вы используете другую версию VS, выберите свой «Набор инструментов платформы» («Platform Toolset»)
Flowchart Tutorial




main.cpp

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
#include <glad/glad.h>
#include <GLFW/glfw3.h>
 
int main()
{
    // Инициализация
    glfwInit();                     // Инициализировать библиотеку GLFW
                                    // Создать окно
    GLFWwindow *window = glfwCreateWindow(256, 256, "Empty Window", nullptr, nullptr);
    glfwMakeContextCurrent(window); // Создать контекст OpenGL для рисования
    gladLoadGL();                   // Инициализировать библиотеку GLAD
 
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // Установить цвет для очистки холста
 
    // Главный цикл приложения
    // Получен сигнал на закрытие окна?
    while (!glfwWindowShouldClose(window))
    {
        // Проверить, были ли активированы какие-либо
        // события (нажатие клавиши, перемещение мыши и
        // т. д.), и вызвать соответствующие функции ответа.
        glfwPollEvents();
 
        glClear(GL_COLOR_BUFFER_BIT);   // Очистить холст заданным ранее цветом
        glfwSwapBuffers(window);        // Поменяйте местами передний и задний буфер рисования
    }
 
    // Очистить ресурсы
    // Очистить ресурсы библиотеки GLFW
    glfwTerminate();
 
    return 0;
}
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,961
Записей в блоге: 216
04.04.2019, 19:45
Sandbox
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2019, 19:45
Помогаю со студенческими работами здесь

Стиль кода: положение фигурных скобок
ребята кто пишет вот так if () { } назовите хоть одно преимущество такой записи перед if()

Стиль кода
Здравствуйте. Вопрос у меня такой возник. Как лучше оформить блок if else, если он использует достаточно длинное условие? Вот как...

Стиль написания кода
Имеется внешний класс. Внутри этого внешнего класса объявлен private static класс. Клиенты внешнего класса не имеют представления о...

Стиль написания кода
Всем привет! Просматривал исходники Perl и обратил внимание на то, что стиль написания кода который представлен ниже, очень короткий по...

Изменить стиль текста из кода
Есть TextViev: ... &lt;TextView style=&quot;@style/MyStyle1&quot; android:id=&quot;@+id/MyTextView&quot; android:text=&quot;@string/MyText&quot; /&gt; ... И...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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