Базовый пример OpenGL 3 для OSX

Базовый пример OpenGL 3 для OSX

Введение

Итак, вы прочитали или читаете какую-нибудь книгу по новому OpenGL (3+ версии), и теперь вам хочется попробовать создать простенькое приложение, чтобы отработать те или иные техники. Если вы хотите создать приложение с нуля, то для того, чтобы вывести хотя бы треугольник необходимо сделать много подготовительной работы: создание и инициализация контекста, подгрузка OpenGL функции версии 3+, создание VBO, компиляция шейдеров и т.д. Все эти вещи полезно знать и попробовать хотя бы раз в жизни, но зачастую лучше использовать готовые библиотеки для этих целей.

Использование библиотека GLFW

Библиотека GLFW поможет вам создать окно, инициализировать контекст и запустить цикл обработки сообщений. Для тех же целей можно использовать и GLUT. GLFW поддерживает Windows, OS X и многие Unix-подобные ОС, использующие X Window System (Linux и FreeBSD).

Самым простым способом установить GLFW скорее всего является использование утилиты brew. Для этого необходимо набрать в командной строке:

brew install glfw3

Другой способ - это компиляция из исходников. На данный момент нужно использовать cmake. Думаю, что инструкция на официальном сайте вам поможет.

Использовать библиотеку тоже не сложно: инициализируем, создаём окно, запускаем цикл обработки сообщений:

    if (!glfwInit())
        return -1;
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    /* Create a windowed mode window and its OpenGL context */
    GLFWwindow* window = glfwCreateWindow(640, 480, "Glfw + Glew + OGLPlus", NULL, NULL);
    while (!glfwWindowShouldClose(window))
    {
        /* Swap front and back buffers */
        glfwSwapBuffers(window);
        /* Poll for and process events */
        glfwPollEvents();
    }

Использование библиотеки GLEW

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

Для получения адреса функций на Windows используется функция wglGetProcAddress, а на Mac OS X NSIsSymbolNameDefined/NSLookupAndBindSymbol/NSAddressOfSymbol. Загружать все эти функции вручную - утомительное занятие. А вот GLEW все сделает за вас. Она загрузит все функции и по нашему желанию сообщит, поддерживается та или иная функция или расширения.

Установку GLEW можно также сделать с помощью brew.

brew install glew

Использовать GLEW тоже довольно просто, необходимо инициализировать его после создания контекста в потоке:

    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        /* Problem: glewInit failed, something is seriously wrong. */
        printf("Error: %s\n", glewGetErrorString(err));
        return -1;
    }
    // Need call after glewInit, because we can have gl error and oglplus will catch it.
    glGetError();

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

Использование библиотеки OGLplus

OGLplus - это набор библиотек, которые реализуют объектно-ориентированный фасад для работы с OpenGL 3+, OpenAL, EGL. Для нас интересны только классы, связанные с OpenGL. Они помогут нам использовать шейдеры, буферы и все остальные OpenGL объекты. Кроме того, библиотека включает много полезных вспомогательных классов, например, геометрические объекты, матрицы.

Собирать OGLplus необходимо также как и многие библиотеки. Инструкцию вы найдете тут. От себя могу добавить, что я использовал параметр --use-glew для конфигурации.

OGLplus - это набор классов. Когда вы его установите, он готов к использованию. В примере вы найдете, как использовать VBO, шейдеры, контекст и другие классы. Стоит только упомянуть, что создание классов OGLplus должно происходить после создания контекста и инициализации GLEW.

Настройка XCode проекта

Данная инструкция была написана для XCode версии 7.2.1.

  • Добавляем в "Header Search Paths" директорию /usr/local/include.
  • В раздел Link Binary With Libraries добавляем 6 библиотек и фреймворков.

  • Подключаем заголовочники в таком порядке:
#include 
#include 
#define GLFW_INCLUDE_GLCOREARB
#include 
#include 

Дефайн GLFW_INCLUDE_GLCOREARB помогает избежать проблем в подгрузке новых функций.

  • В раздел "Library Search Paths" добавляем директорию "/usr/local/lib".
  • Использует библиотеки в таком порядке:
    • Инициализируем glfw, создаём окно и контекст.
    • Инициализируем glew.
    • Создаём любые классы OGLplus.

Пример

Готовый пример, которые окрашивает сферу, вы найдёте на github.com/UnickSoft. В этом примере я использовал объект сферы из OGLplus и два простых шейдера, которые эмулируют освещение.

Теги: OpenGL Mac OS X