В современной компьютерной графике OpenGL и связанные с ним библиотеки с открытым исходным кодом играют жизненно важную роль. Эти библиотеки предоставляют богатый набор функций и инструментов, которые позволяют разработчикам легко создавать сложные графические приложения. Вот краткое описание связей и концепций между OpenGL, GLEW, GLFW, GLM, Assimp и GL, GLUT, FreeGLUT, GLAD и другими библиотеками, а также их роль в графическом программировании.
OpenGL и его основные понятия
OpenGL (открытая графическая библиотека) — это кроссплатформенный графический API для рендеринга 2D- и 3D-графики. Он предоставляет набор функций для рендеринга графики, позволяя разработчикам использовать преимущества мощной производительности графического процессора для создания сложных графических эффектов. OpenGL — это открытый стандарт, поддерживаемый и обновляемый Khronos Group. OpenGL имеет только структуру, но не имеет реализации, поскольку OpenGL имеет только объявления функций и не имеет реализации исходных файлов, подобно интерфейсам и виртуальным функциям. Все реализации предоставляются производителем видеокарты. Например, NVIDIA или AMD должны сами реализовать содержимое функций OpenGL, чтобы разные производители могли обеспечить оптимизацию для своих продуктов. API, связанные с библиотекой функций OpenGL, включают базовую библиотеку (gl), библиотеку утилит (glu), вспомогательную библиотеку (aux), библиотеку утилит (glut), библиотеку окон (glx, agl, wgl) и библиотеку расширенных функций и т. д. gl — ядро, gl — частичная инкапсуляция gl, glx, agl и wgl — функции для разных оконных систем. Glut — это набор инструментов для кроссплатформенных программ OpenGL. Библиотека расширенных функций — это функция, разработанная производителями оборудования для использования механизма расширения OpenGL для реализации обновлений оборудования.
GLEW(OpenGL Extension Wrangler Library):это специализированное управлениеOpenGLрасширенныйC/C++Библиотека。в графикепрограммированиесередина,через некоторое время,Функциональность OpenGL продолжает расширяться и обновляться.,Новые функции и возможности добавляются в OpenGL в виде расширений. Эти расширения предоставляют дополнительные функции.,Например, новая технология рендеринга, более эффективный конвейер рендеринга, новые графические эффекты и т. д. Однако,Различные реализации OpenGL могут поддерживать разные расширения.,И разработчикам приходится писать разные коды, чтобы адаптироваться к разным расширениям.,Это увеличивает сложность разработки. Именно здесь в игру вступает GLEW. GLEW упрощает процесс использования расширений OpenGL. Он предоставляет набор функций для запроса и загрузки расширений OpenGL.,Это позволяет разработчикам легко использовать новейшие функции, не беспокоясь о различиях между разными платформами. Конкретно,GLEW предоставляет следующие функции:
В целом, GLEW упрощает процесс использования расширений OpenGL, повышает эффективность разработки и обеспечивает кроссплатформенную совместимость. Разработчики могут больше сосредоточиться на реализации функций и эффектов графических приложений, не уделяя слишком много внимания деталям загрузки и управления базовыми расширениями.
GLFW(Graphics Library Framework):предназначен для упрощения процесса разработки графических приложений,Особенно когда дело касается создания окон и обработки пользовательского ввода. Оконные системы операционных систем зачастую сложны и дифференцированы.,Поэтому прямое взаимодействие с ним увеличит рабочую нагрузку разработчика. GLFW предоставляет унифицированный интерфейс,Защищает разработчиков от различий в базовых операционных системах.,Делает разработку графических приложений проще и эффективнее.,GLFWБиблиотека Предоставляется следующая поддержка:
Таким образом, GLFW — это мощная, простая в использовании и кроссплатформенная графическая библиотека. Она предоставляет разработчикам унифицированный интерфейс для создания окон, управления ими и обработки пользовательского ввода, что упрощает и повышает эффективность разработки графических приложений.
GLM(OpenGL Mathematics):является посвященнымOpenGLи математика графики Библиотека,Разработан для предоставления разнообразных математических функций и структур данных.,чтобы облегчитьв графикепрограммированиесередина Выполнять математические расчеты。GLMЦель проекта – работать сOpenGL API совместим и предоставляет аналогичный GLSL (OpenGL Shading Language), позволяющий выполнять математические операции на процессоре, аналогичные тем, которые выполняются на графическом процессоре. Библиотека GLM обеспечивает поддержку:
Итак, GLM — это многофункциональная, простая в использовании и высокопроизводительная математическая библиотека, обеспечивающая мощную математическую поддержку графического программирования. Благодаря совместимости с API OpenGL и синтаксисом в стиле GLSL, GLM позволяет разработчикам легко выполнять математические операции на ЦП, аналогичные тем, которые выполняются на графическом процессоре, для достижения сложных графических эффектов и вычислений.
Assimp(Open Asset Import Library):является мощным Библиотека,Специально разработан для импорта и экспорта файлов 3D-моделей в различных форматах. В графическом программировании,Часто возникает необходимость обработки 3D-моделей из разных источников и в разных форматах.,Такие как OBJ, FBX, Collada и т. д. Роль Assimp — предоставить разработчикам единый интерфейс.,Позволяет им легко импортировать файлы моделей в различных форматах.,и может быть легко использован в программесерединаобрабатывать и использовать。AssimpБиблиотека Предоставляется следующая поддержка:
Таким образом, Assimp — это очень практичная и мощная библиотека, обеспечивающая удобство и поддержку для разработчиков обработки 3D-моделей в различных форматах. Его унифицированный интерфейс, поддержка нескольких форматов файлов и дополнительные функции упрощают разработчикам импорт, обработку и использование файлов 3D-моделей, тем самым ускоряя процесс разработки и повышая эффективность.
GL, GLUT, FreeGLUT и РАДОСТЬ
GL (графическая библиотека): GL является предшественником OpenGL и одной из основных библиотек графического программирования. Он предоставляет ряд основных графических функций, таких как рисование точек, линий, треугольников и т. д. В ранних версиях OpenGL разработчики обычно использовали библиотеку GL непосредственно для рисования базовой графики, например, вызывая glBegin() и glEnd() для указания рисуемой геометрии и используя glVertex() для указания координат вершин. Хотя современный OpenGL устранил эти методы фиксированного конвейерного рисования и принял программируемые шейдеры, GL все еще существует как часть OpenGL и до сих пор используется в некоторых конкретных сценариях.
GLUT (OpenGL Utility Toolkit): GLUT — это библиотека для создания окон и обработки пользовательского ввода, предназначенная для упрощения процесса разработки приложений OpenGL. Он предоставляет набор простых и удобных в использовании функций, таких как создание окон, обработка ввода с клавиатуры и мыши, управление событиями окна и т. д. Используя GLUT, разработчики могут быстро создать базовую структуру приложений OpenGL, не обращая внимания на базовые детали управления окнами и обработки событий. Однако из-за относительно ограниченных функций и недостаточной гибкости GLUT его может быть недостаточно в некоторых сложных сценариях применения.
FreeGLUT: FreeGLUT — это альтернатива GLUT с открытым исходным кодом, разработанная для улучшения и расширения функциональности GLUT при сохранении совместимости. По сравнению с GLUT, FreeGLUT внес некоторые улучшения и расширения функциональности, такие как поддержка нескольких окон, поддержка большего количества событий клавиатуры и мыши и предоставление большего количества функций таймера. В то же время FreeGLUT также исправил некоторые ошибки и недостатки GLUT, что позволяет разработчикам более гибко использовать и расширять эту библиотеку.
GLAD (генератор загрузчика OpenGL): GLAD — это библиотека для загрузки указателей функций OpenGL, предназначенная для упрощения процесса кросс-платформенной разработки OpenGL. При использовании OpenGL вам обычно необходимо загрузить указатель функции OpenGL, чтобы вызвать функцию OpenGL во время выполнения. Роль GLAD состоит в том, чтобы автоматически генерировать код загрузки для этих указателей функций, чтобы разработчики могли легко использовать OpenGL на разных платформах, не беспокоясь о ручной загрузке указателей функций. GLAD может автоматически генерировать соответствующие коды загрузки на основе версии OpenGL и списка расширений, указанных пользователем, и поддерживает несколько языков программирования, таких как C/C++, Python и т. д., что позволяет разработчикам использовать его в различных средах разработки.
Между этими библиотеками существует тесная связь, и они часто используются вместе для реализации сложных графических приложений. Например, типичное приложение OpenGL может использовать GLEW для управления расширениями OpenGL, GLFW для создания окон и обработки пользовательского ввода, GLM для выполнения математических вычислений и Assimp для загрузки и обработки 3D-моделей. На заре разработки OpenGL разработчики могли использовать GLUT или FreeGLUT для создания окон и обработки ввода.
Реализация кода
Код 1
// Включает стандартные файлы заголовков
#include <stdio.h>
#include <stdlib.h>
// Включать GLEW Библиотека
#include <GL/glew.h>
// Включать GLFW Библиотека
#include <GLFW/glfw3.h>
// Включать GLM Библиотека
#include <glm/glm.hpp>
using namespace glm;
GLFWwindow* window;
int main(void)
{
// инициализация GLFW
if (!glfwInit())
{
fprintf(stderr, "Failed to initialize GLFW\n");
getchar();
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4); // Установить мультисэмплирование сглаживания
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // OpenGL Основной номер версии
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // OpenGL Дополнительный номер версии
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // позволять macOS Улучшенная совместимость с платформами, обычно не требуется.
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Использовать основной режим
// Создание окон и их OpenGL контекст
window = glfwCreateWindow(1024, 768, "hello world 01", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
getchar();
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// инициализация GLEW
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
getchar();
glfwTerminate();
return -1;
}
// Обязательно зафиксируйте ESC событие нажатия клавиши
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
// Установить темно-синий фон
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
do {
// Очистите экран.
glClear(GL_COLOR_BUFFER_BIT);
// Ничего не рисовать
// буфер подкачки
glfwSwapBuffers(window);
glfwPollEvents();
} // исследовать ESC Была ли нажата клавиша или закрыто окно
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);
// закрытие OpenGL окно и завершить работу GLFW
glfwTerminate();
return 0;
}
Результаты бега
Код 2
#include <GL/glut.h>
#include <cmath> // Включить заголовочный файл cmath
#include <iostream>
float cameraAngleX = 45.0f; // Угол поворота камеры по оси X
float cameraAngleY = 45.0f; // Угол поворота камеры по оси Y
float cameraDistance = 10.0f; // Расстояние между камерой и началом координат
int lastMouseX = 0; // Последняя позиция мыши по X
int lastMouseY = 0; // Последняя позиция мыши по оси Y
void init() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Установить цвет фона на черный
glEnable(GL_DEPTH_TEST); // Включить тестирование глубины
}
void drawGrid() {
// Рисовать линии сетки
glColor3f(1.0f, 1.0f, 1.0f); // Установите цвет на белый
glBegin(GL_LINES);
// нарисовать горизонтальную линию
for (float i = -10.0f; i <= 10.0f; ++i) {
glVertex3f(-10.0f, 0.0f, i);
glVertex3f(10.0f, 0.0f, i);
}
// Нарисуйте вертикальные линии
for (float i = -10.0f; i <= 10.0f; ++i) {
glVertex3f(i, 0.0f, -10.0f);
glVertex3f(i, 0.0f, 10.0f);
}
glEnd();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// Установите положение и перспективу камеры
gluLookAt(cameraDistance * sin(cameraAngleX * 3.14159265f / 180.0f), cameraDistance * sin(cameraAngleY * 3.14159265f / 180.0f), cameraDistance * cos(cameraAngleX * 3.14159265f / 180.0f),
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
drawGrid();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
lastMouseX = x;
lastMouseY = y;
}
}
void motion(int x, int y) {
float deltaX = x - lastMouseX;
float deltaY = y - lastMouseY;
cameraAngleX += deltaX * 0.1f;
cameraAngleY += deltaY * 0.1f;
lastMouseX = x;
lastMouseY = y;
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 27: // ЭКУ
exit(0);
break;
case '+': // Увеличить масштаб
cameraDistance -= 0.1f;
if (cameraDistance < 1.0f) cameraDistance = 1.0f;
break;
case '-': // Уменьшить масштаб
cameraDistance += 0.1f;
if (cameraDistance > 20.0f) cameraDistance = 20.0f;
break;
}
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL Window");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
Результаты бега