Базовый пример 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 и два простых шейдера, которые эмулируют освещение.