Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/56: Рейтинг темы: голосов - 56, средняя оценка - 4.93
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33

Поддерживаемые библиотеки для 2D графики

23.09.2019, 17:02. Показов 11413. Ответов 32

Студворк — интернет-сервис помощи студентам
Хочу спросить народ, какие библиотеки для 2D графики сейчас поддерживаются, например, я знаю библиотеку SFML и она вроде как поддерживается, выходят новые версии и так далее. А какие библиотеки ещё поддерживаются?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2019, 17:02
Ответы с готовыми решениями:

С++ библиотеки для консольной графики
Доброго времени суток. Какие в с++ есть библиотеки для создания консольной графики? Заранее спасибо.

Библиотеки для написания графики и GUI
начал изучать с. В будущем в качестве проекта хочу написать программу, которая бы представляла тело человека с движущейся графикой(клетки...

Нугеты\библиотеки для построения графики
Всем привет надо найти какие-то готовые бесплатные решения (для некоммерческого) проекта для автоматической генерации диаграмм. Каких...

32
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33
26.09.2019, 23:50  [ТС]
Студворк — интернет-сервис помощи студентам
Кстати, тут я недавно наткнулся на то, что openGL это процедурная библиотека, а на плюсах в основном пишут в ООП. Так вот где можно попрактиковаться в ООП или где можно улучшить свои скиллы написания кода, а то чуть более менее большая программа и я начинаю запутываться в ней. Проги были на sfml, но чувствую, что для openGL понадобятся получше навыки.
0
9993 / 2965 / 497
Регистрация: 05.10.2013
Сообщений: 8,151
Записей в блоге: 244
27.09.2019, 01:18
Цитата Сообщение от AlexNaraito Посмотреть сообщение
openGL это процедурная библиотека, а на плюсах в основном пишут в ООП.
Вы должны сами написать обёртку в видео ООП над OpenGL вызовами.

Цитата Сообщение от AlexNaraito Посмотреть сообщение
но чувствую, что для openGL понадобятся получше навыки.
Чтобы практиковаться в OpenGL, нужно много писать кода на OpenGL. Поставьте себе цель нарисовать квадрат. Далее, как двигать его. Когда вы узнали, как двигать квадрат можно попрактиковаться в создании простой игры: понг, змейка, арканойд. Игру можно писать в ООП стиле. Первую версию игру нужно писать так, как получится, а не так как красиво, а потом следующую версию писать более красиво. Этот процесс - это постоянная работа. Узнаёте что-то новое, применяете в своих простых играх несколько раз, так рождается навык, опять узнаёте что-то новое и применяете множество раз на практике, опять рождается навык и т.д. Это не даётся всё сразу, в один день. Это часы, дни, недели, месяцы, годы и десятилетия.

Добавлено через 14 минут
Я вам скину проект для Visual Studio, в котором уже подключена библиотека GLFW. Должно сразу заработать, но не факт. Кстати, попробуйте открыть и запустить. Делалось давно в VS2015. Интересно будет ли работать в VS2019. У себя не могу проверить, как как я не стал ставить C++, когда ставил VS2019, чтобы место на ноуте сэкономить, так как C++ мне пока не нужен: Rectangle_OpenGL33GlfwCpp.zip

Добавлено через 55 секунд
Вот такой там код:

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
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
#include <iostream>
#include <string>
 
#include <glad/glad.h>
#include <GLFW/glfw3.h>
 
int fatalError(std::string errorString);
 
// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;
 
// Shaders
const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
"}\0";
const GLchar* fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
 
// The MAIN function, from here we start the application and run the game loop
int main()
{
    // Set all the required options for GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
 
    //glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
 
    if (!glfwInit())
    {
        return fatalError("Faied to initialize GLFW");
    }
 
    // Create a GLFWwindow object that we can use for GLFW's functions
    GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
 
    if (nullptr == window)
    {
        return fatalError("Failed to create GLFW window");
    }
 
    int screenWidth, screenHeight;
    glfwGetFramebufferSize(window, &screenWidth, &screenHeight);
 
    glfwMakeContextCurrent(window);
 
    // Initialize GLAD to setup the OpenGL Function pointers
    if (!gladLoadGL())
    {
        return fatalError("Failed to initialize GLAD");
    }
 
    // Define the viewport dimensions
    glViewport(0, 0, screenWidth, screenHeight);
 
 
    // Build and compile our shader program
    // Vertex shader
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
 
    // Check for compile time errors
    GLint success;
    GLchar infoLog[512];
 
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
 
    // Fragment shader
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
 
    // Check for compile time errors
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
 
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
 
    // Link shaders
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
 
    // Check for linking errors
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
 
    if (!success)
    {
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    }
 
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
 
    // Set up vertex data (and buffer(s)) and attribute pointers
    GLfloat vertices[] =
    {
        -0.5f, -0.5f, 0.0f, // Bottom-Left
         0.5f, -0.5f, 0.0f, // Bottom-Right
        -0.5f,  0.5f, 0.0f, // Top-Left
         0.5f,  0.5f, 0.0f  // Top-Right
    };
 
    GLuint VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
    glBindVertexArray(VAO);
 
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0);
    glEnableVertexAttribArray(0);
 
    glBindBuffer(GL_ARRAY_BUFFER, 0); // Note that this is allowed, the call to glVertexAttribPointer registered VBO as the currently bound vertex buffer object so afterwards we can safely unbind
 
    glBindVertexArray(0); // Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs)
 
    // Game loop
    while (!glfwWindowShouldClose(window))
    {
        // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
        glfwPollEvents();
 
        // Render
        // Clear the colorbuffer
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
 
        // Draw our first triangle
        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        glBindVertexArray(0);
 
        // Swap the screen buffers
        glfwSwapBuffers(window);
    }
 
    // Properly de-allocate all resources once they've outlived their purpose
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
 
    // Terminate GLFW, clearing any resources allocated by GLFW.
    glfwTerminate();
 
    return EXIT_SUCCESS;
}
 
int fatalError(std::string errorString)
{
    std::cout << errorString << std::endl;
    std::cout << "Press Enter key to quit..." << std::endl;
    std::getchar();
    glfwTerminate();
    return EXIT_FAILURE;
}
0
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33
27.09.2019, 08:17  [ТС]
Буду дома проверю.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
27.09.2019, 10:20
Цитата Сообщение от AlexNaraito Посмотреть сообщение
что лучше для программиста с++ windows или дистрибутив linux какой-нибудь?
Под Windows распространены среды разработки (IDE), то есть это относительно быстрый старт.
Под Linux чаще используются низкоуровневые инструменты - консоль, текстовые редакторы, make и т.п., то есть это хорошая возможность глубже разобраться в магии превращения текста в программу. При достаточном погружении все эти монструозные IDE станут не так уж и нужны - все можно сделать руками, получится быстрее и гибче. Но документации придется выкурить много.
Это не строгое правило, а статистика: можно использовать и консоль под windows, и среды разработки в linux, никто не запрещал.
Если сравнивать сложности входа:
IDE: придется найти как создавать именно консольный проект, как компилировать, собирать, подключать сторонние библиотеки. Как пользоваться отладкой (впоследствии это станет плюсом, но изучить все-таки придется).
консоль: придется прочитать как пользоваться компилятором. Писать программу будете, скорее всего, в текстовом редакторе, не обязательно с поддержкой подсветки, подсказок и прочих свистелок. Проблемы с подключением библитек тоже будут, хотя и более предсказуемые.
Отдельно по поводу VisualStudio: придется найти способ заставить ее следовать стандартам и не лезть со своими богомерзкими printf_s.
Цитата Сообщение от AlexNaraito Посмотреть сообщение
openGL это процедурная библиотека, а на плюсах в основном пишут в ООП.
Никто же вас не заставляет пихать объекты во все щели. Процедурное программирование, функциональное, ООП - всего лишь инструменты, какой использовать выбирайте сами.
1
9993 / 2965 / 497
Регистрация: 05.10.2013
Сообщений: 8,151
Записей в блоге: 244
27.09.2019, 12:34
Само по себе изучение OpenGL требует много времени для отработки знаний на практике. Чтобы не тратить время на технические детали компиляторов, вы лучше один раз подключите всё что нужно к VS и забудьте пока об этом. Сосредоточьтесь на изучении OpenGL, VBO, VAO и т.д. А самое главное - пишите простые 2D/3D игры и придумывайте разные примеры для реализации. Надо уметь временно отбрасывать то, что можно когда-нибудь позже поизучать, а сосредотачиваться на более важных на данный момент вещах.

Если хотите научиться правильно следовать принципам ООП, то неизбежно придётся начать изучать паттерны проектирования. Паттерны - это азбука ООП, или таблица умножения ООП. Но пока что отложите ООП в долгий ящик, на следующий год, или вернётесь к ним через 2 года. Сейчас не отвлекайтесь, потому что вам нужно изучить курс "Learn OpenGL", основы работы с векторами, матрицами, вспоминать школьную тригонометрию и сделать так, чтобы всё это постоянно кружилось в голове и реализовывалось на практике в видео ваших примеров и простых прототипов игр. Старайтесь, чтобы вас не отвлекало то, к чем можно потом при необходимости вернуться.

Приведу цитату, как человек хорошо выразил свою мысль:

Цитата Сообщение от Otaka Посмотреть сообщение
Согласен. Сначала учишься вообще программированию: переменные, условия, циклы, функции. Потом учишься загружать и выводить картиночки на экран и обрабатывать сообщения мыши.
Все, больше ничего не нужно. По крайней мере, я все делал так.
Если ты это все хорошо поймешь, то вопрос "что почитать?" не будет возникать у тебя.
А когда ты достигнешь такого уровня, что просто нагромождение кода "переменныеУсловияЦиклыФункции" накапливаются в таком количестве, что тебе будет уже тяжело с ними справляться, то до тебя дойдет идея и волшебство ООП. И ты сможешь использовать классы/наследование там где это действительно нужно, а не потому что тебе сказали:"только лопухи пишут код процедурно, а не по оопшному".
Цитата Сообщение от Otaka Посмотреть сообщение
Книг, чтобы и игры и С++, и чтобы простенько, не знаю. Как по мне, так сначала нужно хорошо понимать язык, птом глянуть пару примеров, придумать идею, а там уже и делать можно. Игры - те же программы, чтобы научится их писать, их нужно писать.
Я с ним согласен.
1
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33
27.09.2019, 13:33  [ТС]
Спасибо за помощь
1
9993 / 2965 / 497
Регистрация: 05.10.2013
Сообщений: 8,151
Записей в блоге: 244
27.09.2019, 14:16
Попробуйте:
  1. cкачать мой пример с рисованием прямоугольника в VS, GLFW, OpenGL 3.3 из сообщения выше
  2. почитать объяснения на Хабре об GLFW и шейдерном OpenGL 3: https://habr.com/ru/post/310790/
  3. переписать этот прототип игры Pong со старого OpenGL 1 на актуальный шейдерный OpenGL 3: https://noobtuts.com/cpp/2d-pong-game
0
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33
27.09.2019, 14:24  [ТС]
Теперь ясно чем я займусь сегодня и на выходных
1
9993 / 2965 / 497
Регистрация: 05.10.2013
Сообщений: 8,151
Записей в блоге: 244
27.09.2019, 14:26
Я переписал. Это действительно очень просто, но только если дело не касается вывода текста (очков игроков). Но это уже следующих этап, где вы научитесь выводить спрайты. Кстати, это один из уроков в том курсе по OpenGL на Хабре, где используется библиотека FreeType для вывода текста. Но в ней нет ничего сложного. На Хабре хорошо описано.

Я использовал технику Bitmap Font для вывода теста. Я сделал две версии: Desktop (C# / OpenGL 3.1) и Web (TypeScript / WebGL 1.0). Можете поиграть в веб-версию и скачать EXE по ссылке.
Миниатюры
Поддерживаемые библиотеки для 2D графики  
0
9993 / 2965 / 497
Регистрация: 05.10.2013
Сообщений: 8,151
Записей в блоге: 244
27.09.2019, 14:33
AlexNaraito, на будущее, если вдруг не
знаете, новые темы связанные с OpenGL создавайте в
специальном разделе для OpenGL: https://www.cyberforum.ru/opengl/
0
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33
27.09.2019, 14:37  [ТС]
Я знаю, просто где мне напечатали там же и отвечаю
0
9993 / 2965 / 497
Регистрация: 05.10.2013
Сообщений: 8,151
Записей в блоге: 244
27.09.2019, 17:45
Цитата Сообщение от AlexNaraito Посмотреть сообщение
Я знаю, просто где мне напечатали там же и отвечаю
Я не про этот ответ, а про будущее. Когда будут проблемы, чтобы вы не в C++ разделе создавали темы, а в OpenGL разделе.
0
6 / 5 / 1
Регистрация: 14.09.2019
Сообщений: 33
27.09.2019, 18:21  [ТС]
Ясно, я бы так и сделал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2019, 18:21

Обмен УТ 11 ---> БП 3 Поддерживаемые версии для обмена
Добрый день уважаемые форумчане !!! Прошу помощи у гуру ... Подскажите пожалуйста - допустим есть типовой обмен УТ 11 ---&gt; БП 3 ... ...

Подключение библиотеки графики graphics.h
Приветствую форумчане, столкнулся с такой проблемой, необходимо подключить графику к приложению. Все делаю по инструкции(в pdf) в...

про библиотеки в VS C++ (какие библиотеки нужны для функций 'cout' и 'cin')
какие библиотеки нужны для функций 'cout' и 'cin' ???

Поддерживаемые типы шрифтов
Какой тип шрифтов в Visual C++ 2008 не поддерживается? Дополнял (редактировал) шрифт в FontForge, в итоге на его иконке буква О сменилась...

Как узнать поддерживаемые монитором разрешения?
Нужно узнать режимы поддерживаемые монитором (разрешение\частота) Все примеры кода которые находил в гугле - выдают режимы видеокарты но...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru