OpenGL и связанные с ним библиотеки с открытым исходным кодом: углубленное исследование инструментов и принципов графического программирования.
OpenGL и связанные с ним библиотеки с открытым исходным кодом: углубленное исследование инструментов и принципов графического программирования.

В современной компьютерной графике 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 предоставляет следующие функции:

  1. Запрос расширения: GLEW позволяет разработчикам запрашивать все расширения, поддерживаемые текущей реализацией OpenGL. Вызвав соответствующую функцию, разработчики могут получить информацию о поддерживаемых расширениях, такую ​​как название, версия, доступность и т. д.
  2. Загрузка расширений: GLEW также предоставляет функцию загрузки указателей на функции расширения OpenGL. Разработчикам нужно только вызвать функцию инициализации GLEW после инициализации контекста OpenGL, и она автоматически обнаружит и загрузит необходимые функции расширения, что позволит разработчикам использовать эти функции напрямую без загрузки вручную.
  3. Межплатформенная совместимость. Поскольку разные операционные системы и графические драйверы могут иметь разные реализации OpenGL, написание кроссплатформенного кода OpenGL может представлять некоторые проблемы. GLEW решает эту проблему, предоставляя унифицированный интерфейс, позволяющий разработчикам написать код один раз и обеспечить его правильную работу на разных платформах.

В целом, GLEW упрощает процесс использования расширений OpenGL, повышает эффективность разработки и обеспечивает кроссплатформенную совместимость. Разработчики могут больше сосредоточиться на реализации функций и эффектов графических приложений, не уделяя слишком много внимания деталям загрузки и управления базовыми расширениями.

GLFW(Graphics Library Framework):предназначен для упрощения процесса разработки графических приложений,Особенно когда дело касается создания окон и обработки пользовательского ввода. Оконные системы операционных систем зачастую сложны и дифференцированы.,Поэтому прямое взаимодействие с ним увеличит рабочую нагрузку разработчика. GLFW предоставляет унифицированный интерфейс,Защищает разработчиков от различий в базовых операционных системах.,Делает разработку графических приложений проще и эффективнее.,GLFWБиблиотека Предоставляется следующая поддержка:

  1. Кроссплатформенная поддержка: GLFW является кроссплатформенным и поддерживает такие операционные системы, как Windows, macOS и Linux. Это означает, что разработчики могут написать код один раз и запускать его в разных операционных системах без необходимости вносить специальные адаптации и настройки для каждой платформы.
  2. Простой в использовании API: дизайн API GLFW прост и интуитивно понятен, что позволяет разработчикам легко создавать окна, обрабатывать ввод пользователя и выполнять другие операции. Например, вы можете создать окно всего с помощью нескольких строк кода и легко установить такие свойства, как размер окна, заголовок и т. д.
  3. Управление окнами: GLFW предоставляет набор мощных функций управления окнами, включая создание, закрытие, свертывание, развертывание и другие операции окон. Разработчики могут управлять состоянием окон с помощью простых вызовов API.
  4. Обработка событий: GLFW может обрабатывать различные события, включая события клавиатуры, события мыши, события окна и т. д. Разработчики могут зарегистрировать функции обратного вызова для обработки этих событий и взаимодействия с пользователями.
  5. Поддержка нескольких окон: GLFW поддерживает создание нескольких окон, и каждое окно может иметь свой собственный контекст и логику обработки событий. Это позволяет разработчикам реализовывать сложные графические интерфейсы, такие как многооконные приложения или игровые движки.
  6. Легкая и эффективная: GLFW — это легкая библиотека с высокой производительностью. Он использует оптимизированную реализацию, позволяющую эффективно выполнять такие операции, как создание окон и обработка событий.

Таким образом, GLFW — это мощная, простая в использовании и кроссплатформенная графическая библиотека. Она предоставляет разработчикам унифицированный интерфейс для создания окон, управления ими и обработки пользовательского ввода, что упрощает и повышает эффективность разработки графических приложений.

GLM(OpenGL Mathematics):является посвященнымOpenGLи математика графики Библиотека,Разработан для предоставления разнообразных математических функций и структур данных.,чтобы облегчитьв графикепрограммированиесередина Выполнять математические расчеты。GLMЦель проекта – работать сOpenGL API совместим и предоставляет аналогичный GLSL (OpenGL Shading Language), позволяющий выполнять математические операции на процессоре, аналогичные тем, которые выполняются на графическом процессоре. Библиотека GLM обеспечивает поддержку:

  1. Векторные и матричные операции: GLM предоставляет множество функций векторных и матричных операций.,Включая сложение, вычитание, умножение и деление векторов и матриц, скалярное произведение, векторное произведение, транспонирование, обратную матрицу и т. д. Эти операции являются основными математическими операциями, часто используемыми в графическом программировании.,Например, преобразование вершин, преобразование матрицы и т. д.
  2. Кватернионы: GLM также обеспечивает поддержку кватернионов, включая сложение, вычитание, умножение, деление, сопряжение, нормализацию, интерполяцию и другие операции с кватернионами. Кватернионы широко используются в графике для представления поворотов, таких как вращение камеры, вращение объекта и т. д.
  3. Синтаксис в стиле GLSL: синтаксис и функции GLM очень похожи на GLSL, включая векторные и матричные конструкторы, доступ к членам, перегрузку операторов и т. д. Это позволяет разработчикам легко использовать GLM с GLSL для обеспечения плавной передачи данных и вычислений между процессором и графическим процессором.
  4. Совместимость и переносимость: GLM — это чистая библиотека заголовков, которая не зависит от каких-либо сторонних библиотек, поэтому ее очень легко интегрировать в существующие проекты. Он также предоставляет обширную документацию и примеры, позволяющие разработчикам быстро приступить к работе и в полной мере использовать его функции.
  5. Оптимизация производительности: GLM использует оптимизированный метод реализации для достижения хорошей производительности при выполнении математических операций на ЦП. Он использует набор инструкций SIMD современных процессоров и возможности параллельных вычислений многоядерных процессоров для достижения эффективных математических операций.

Итак, GLM — это многофункциональная, простая в использовании и высокопроизводительная математическая библиотека, обеспечивающая мощную математическую поддержку графического программирования. Благодаря совместимости с API OpenGL и синтаксисом в стиле GLSL, GLM позволяет разработчикам легко выполнять математические операции на ЦП, аналогичные тем, которые выполняются на графическом процессоре, для достижения сложных графических эффектов и вычислений.

Assimp(Open Asset Import Library):является мощным Библиотека,Специально разработан для импорта и экспорта файлов 3D-моделей в различных форматах. В графическом программировании,Часто возникает необходимость обработки 3D-моделей из разных источников и в разных форматах.,Такие как OBJ, FBX, Collada и т. д. Роль Assimp — предоставить разработчикам единый интерфейс.,Позволяет им легко импортировать файлы моделей в различных форматах.,и может быть легко использован в программесерединаобрабатывать и использовать。AssimpБиблиотека Предоставляется следующая поддержка:

  1. Поддержка нескольких форматов файлов: Assimp поддерживает импорт и экспорт нескольких распространенных форматов файлов 3D-моделей.,Включая, помимо прочего, OBJ, FBX, Collada, STL, 3DS и т. д. Это означает, что разработчики могут использовать Assimp напрямую для обработки файлов моделей из различных источников.,без необходимости полагаться на другой импортинструментили Библиотека。
  2. Унифицированная структура данных: Assimp преобразует файлы моделей в разных форматах в единую структуру данных, позволяя разработчикам унифицированно получать доступ к вершинам модели, нормалям, координатам текстур и другой информации. Таким образом, разработчики могут писать общий код для обработки моделей в разных форматах без необходимости писать специальную логику для каждого формата.
  3. Дополнительные функции: В дополнение к базовым функциям импорта и экспорта модели, Assimp также предоставляет некоторые дополнительные функции, такие как обработка сетки, загрузка текстур, обработка материалов и т. д. Разработчики могут использовать эти функции для дальнейшей обработки модели, например оптимизации сетки, наложения текстур, преобразования материалов и т. д.
  4. Кроссплатформенная совместимость: Assimp — это кроссплатформенная библиотека, поддерживающая Windows, macOS, Linux и другие операционные системы. Это означает, что разработчики могут использовать один и тот же код для обработки файлов моделей на разных платформах, не беспокоясь о различиях между платформами.
  5. Активная поддержка сообщества: 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

Язык кода:javascript
копировать
// Включает стандартные файлы заголовков
#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

Язык кода:javascript
копировать
#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;
}

Результаты бега

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода