Урок №2. Подготовка к первому проекту OpenGL: настройка GLFW, CMake и GLAD

  Дмитрий Бушуев  | 

  Обновл. 4 Апр 2020  | 

 11731

 ǀ   23 

Первое, что нам нужно сделать, прежде чем мы начнём программировать графику, — это создать контекст OpenGL и окно приложения для рисования. Однако, данные операции являются специфичными для каждой операционной системы, поэтому OpenGL целенаправленно пытается абстрагироваться от них. Это означает, что мы самостоятельно должны создать окно, определить контекст и обрабатывать пользовательский ввод.

К счастью, существует довольно много библиотек, которые обеспечивают необходимый нам функционал, при этом некоторые из них специально нацелены на работу с OpenGL. Эти библиотеки избавят нас от всей специфической работы, связанной с особенностями конкретной операционной системы. Одними из наиболее популярных библиотек являются: GLUT, SDL, SFML и GLFW. В этих уроках мы будем использовать GLFW. Вы также можете использовать и любую другую библиотеку из списка выше, т.к. установка и настройка для большинства из них аналогична установке и настройке GLFW.

Библиотека GLFW

GLFW (англ. «Graphics Library FrameWork») — это библиотека, написанная на языке С, специально предназначенная для работы с OpenGL. GLFW предоставит нам все необходимые инструменты, которые потребуется для рендеринга на экран различных объектов. Благодаря этому мы сможем создавать контексты OpenGL, определять параметры окна и обрабатывать пользовательский ввод, что вполне коррелирует с нашими целями.

Основное внимание в этой и следующей главах уделяется тому, чтобы разобраться с библиотекой GLFW, создать корректный контекст OpenGL и простое окно, в котором мы и будем рисовать наши объекты. В этом уроке мы пошагово рассмотрим установку библиотеки GLFW, а также процесс сборки и компиляции программы в связке с GLFW. На момент написания данной статьи в качестве среды разработки мы будем использовать Microsoft Visual Studio 2019 (обратите внимание, что наши действия будут аналогичными и с более старыми версиями Visual Studio). Если же вы используете более старую версию Visual Studio (или вообще другую среду разработки), то можете быть спокойны, т.к. процесс установки и настройки GLFW аналогичен в большинстве IDE.

Сборка GLFW


Библиотеку GLFW можно скачать с официального сайта. Стоит заметить, что GLFW уже имеет предварительно скомпилированные бинарные и заголовочные файлы для Visual Studio 2010-2019, но для полноты картины их мы использовать не будем, а вместо этого вручную скомпилируем GLFW из исходного кода. Это делается для того, чтобы вы сами прочувствовали процесс компиляции библиотек с открытым исходным кодом, поскольку не каждая подобная библиотека будет предоставлять возможность скачать предварительно скомпилированные бинарные файлы. Итак, давайте загрузим пакет с исходным кодом.

Примечание: Мы будем собирать все библиотеки в формате 64-битных бинарных файлов, поэтому убедитесь, что скачиваете и используете именно 64-битные бинарные файлы.

После загрузки пакета с файлами исходного кода, извлеките и откройте его содержимое. Нас интересуют следующие вещи:

   библиотека, которая будет получена в результате компиляции;

   папка include.

Компиляция библиотек из исходного кода гарантирует, что полученная нами библиотека идеально подойдёт для нашего процессора и операционной системы, в то время как предварительно скомпилированные бинарные файлы не всегда могут этим похвастаться (иногда они вообще недоступны для вашей системы). Однако проблема проектов, распространяющихся под эгидой открытого программного обеспечения, заключается в том, что не все используют одну и ту же IDE или систему сборки для разработки своего приложения, а это значит, что предоставленные файлы проекта/решения могут быть несовместимы с настройками IDE у других людей. Следовательно, каждый конечный пользователь должен настроить свой собственный проект/решение с учётом полученных *.с/*.cpp и *.h/*.hpp файлов, что почти всегда является довольно трудоёмким и громоздким процессом. Но не спешите расстраиваться, для решения данной проблемы уже существует удобный инструмент сборки проектов под названием CMake.

CMake

CMake — это инструмент, который, с использованием заранее определённых сценариев, может из коллекции файлов исходного кода сгенерировать файлы проектов/решений под выбранную пользователем IDE (например, для Visual Studio, Code::Blocks или Eclipse). Он позволит нам из исходного пакета файлов GLFW создать файл проекта под среду разработки Visual Studio 2019, а затем данный файл мы сможем использовать для компиляции библиотеки. Но сначала нам нужно скачать, а затем установить CMake.

После установки CMake у вас будет 2 варианта:

   запустить CMake из командной строки;

   запустить Cmake через графический интерфейс.

Поскольку мы не стремимся всё усложнять, то остановимся на варианте с использованием графического интерфейса. Для работы с CMake нам потребуется указать папку с файлами исходного кода проекта (в нашем случае glfw-3.3.2) и папку назначения для бинарных файлов. Для папки исходного кода мы собираемся выбрать корневую папку загруженного исходного пакета GLFW, а для папки сборки мы создадим новый каталог build:

После того, как мы прописали пути для исходной и целевой папок, нам нужно нажать на кнопку Configure, чтобы CMake cмог просмотреть исходные файлы GLFW и выбрать необходимые параметры для сборки.

В следующем окне необходимо задать используемую версию Visual Studio. Т.к. работать мы будем в Visual Studio 2019, то выбираем опцию "Visual Studio 16 2019":

Далее, CMake отобразит возможные варианты сборки библиотеки. Можно оставить значения по умолчанию и снова нажать кнопку Configure, чтобы сохранить настройки:


После установки параметров мы нажимаем кнопку "Generate", в результате чего в папке build будут созданы необходимые файлы проекта.

Компиляция проекта


Теперь, зайдя в папку build, среди всего прочего можно увидеть файл с именем GLFW.sln, открываем его с помощью Visual Studio 2019:

Поскольку CMake сгенерировал файл проекта, который уже содержит соответствующие параметры конфигурации, нам остаётся лишь построить решение. При этом CMake должен был автоматически настроить вариант компилирования решения в виде 64-битной библиотеки. Благодаря этому мы получим скомпилированный файл библиотеки с именем glfw3.lib, который будет находиться в папке build/src/Debug.

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

   Способ №1: Можно скопировать содержимое папки include проекта GLFW в соответствующую папку include вашей IDE или компилятора, а также скопировать полученный файл glfwlib в соответствующую папку /lib вашей IDE или компилятора. Данный способ вполне рабочий, но мы его не рекомендуем, так как новая установка IDE или компилятора приведёт к тому, что вам заново придётся подключать необходимые файлы.

   Способ №2: Вы можете создать новую папку, которая будет содержать все заголовочные файлы и файлы из сторонних библиотек, на которую вы впоследствии сможете ссылаться из своей IDE или компилятора. Например, можно создать папку, в которой будут находиться папки Lib и Include. В них мы будем хранить все наши библиотечные и подключаемые файлы, которые собираемся использовать для наших OpenGL-проектов. Получается, что все сторонние библиотеки будут организованы в одном месте (и их можно будет совместно использовать на нескольких компьютерах). Однако, каждый раз при создании нового проекта, мы должны будем указывать IDE соответствующие пути к этим папкам.

Как только необходимые файлы будут сохранены в выбранном вами месте, мы сможем приступить к созданию нашего первого OpenGL-GLFW-проекта.

Наш первый проект

Для начала давайте откроем Visual Studio и создадим новый проект. Для этого нужно выбрать тип проекта — "C++", а далее — "Пустой проект" (не забудьте дать проекту подходящее имя):

Теперь у нас есть рабочее пространство для создания нашего самого первого OpenGL-приложения!

Линкинг проекта


Для того, чтобы наш проект мог использовать GLFW, нам нужно связать с ним полученную библиотеку. Это можно сделать, указав в настройках линкера, что мы хотим использовать библиотеку glfw3.lib, но проект пока не знает где её искать, т.к. все подобные файлы мы переместили в другую папку. Таким образом, сначала мы должны добавить эту папку в наш проект.

Для этого нажмите правой кнопкой на имя проекта в "Обозревателе Решений" -> "Свойства". В появившемся окне выберите "Каталоги VC++" -> "Каталоги библиотек":

Здесь вы можете добавить свои собственные каталоги, чтобы проект знал, где искать необходимые файлы. Это можно сделать, вставив вручную путь до каталога или щёлкнув по соответствующей строчке и выбрав пункт <Изменить…>, в результате чего откроется следующее окно:

Здесь вы можете добавить столько дополнительных каталогов, сколько захотите, и с этого момента IDE при поиске файлов библиотек также будет просматривать и эти директории. Поэтому, как только вы подключите папку Lib из проекта GLFW, вы сможете использовать все файлы библиотек из этой папки. Аналогично обстоят дела и с добавлением папки Include для заголовочных файлов.

Поскольку для VS были указаны все необходимые файлы, то мы, наконец, можем связать GLFW с нашим проектом, перейдя в раздел "Компоновщик" -> "Ввод":

Чтобы связать библиотеку нам нужно указать для компоновщика её имя. Так как библиотека называется glfw3.lib, то мы добавляем название этого файла в раздел "Дополнительные зависимости" (вручную или же через пункт <Изменить…>) и с этого момента, при запуске процесса компиляции, GLFW будет связан с нашим проектом. В дополнение к GLFW мы также должны добавить ссылки на библиотеку OpenGL, но данные действия будут отличаться в зависимости от (вашей) используемой операционной системы:

   Библиотека OpenGL в Windows. Если вы используете операционную систему Windows, то необходимый нам файл библиотеки opengl32.lib, входящий в пакет Microsoft SDK, уже есть вместе с Visual Studio и не требует отдельной установки. Поскольку в описываемой главе мы используем компилятор VS и работаем под операционной системой Windows, то всё, что вам нужно сделать — это добавить название файла opengl32.lib к общему списку параметров компоновщика.

   Библиотека OpenGL в Linux. Если вы работает в операционной системе Linux, то вам нужно подключить библиотеку libGL.so с помощью ключей –lGL, добавляемых к параметрам вашего компоновщика. Если вы не можете найти данную библиотеку, то вам, вероятно, необходимо установить любой из пакетов Mesa, NVidia или AMD dev.

Затем, после добавления библиотек GLFW и OpenGL в настройки компоновщика, вы сможете подключить заголовочные файлы GLFW следующей строчкой кода:

Примечание: Для пользователей Linux, использующих компилятор GCC, помочь скомпилировать проект помогут следующие параметры командной строки:

-lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi –ldl

Неправильное линкование соответствующих библиотек приведёт к возникновению ошибок.

На этом установка и настройка GLFW завершается.

GLAD

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

В Windows это выглядит примерно следующим образом:

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

Установка GLAD


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

Перейдите в веб-сервис GLAD, убедитесь, что в поле «Language» выбран язык "C/C++" и в разделе «API» выберите версию OpenGL — 3.3 (именно её мы и будем использовать; хотя более высокие версии также подойдут). Кроме того, убедитесь, что в поле «Profile» установлено "Core":

Также параметр "Generate a loader" должен быть отмечен галочкой. Пункт «Extensions» мы пока пропустим, остается нажать кнопку "Generate", чтобы создать нужные нам файлы библиотеки:

К этому моменту GLAD предоставит вам возможность скачать zip-архив, содержащий в себе две подключаемые папки и файл glad.c. Вам нужно скопировать обе эти папки (glad и KHR) в свою папку с подключаемыми файлами (или добавьте дополнительный элемент, указывающий на эти папки в свойствах проекта), а также добавить файл glad.c в свой проект.

После выполнения этих шагов вы сможете использовать следующую директиву include:

Теперь, при попытке скомпилировать проект, у вас не должно возникать никаких ошибок.

В следующем уроке мы рассмотрим использование GLFW, настройку контекста OpenGL и создание окна. Обязательно убедитесь, что все ваши include- и library- каталоги являются корректными и что имена библиотек в настройках компоновщика соответствуют указанным библиотекам.

Дополнительные ресурсы

   GLFW: Window Guide: официальное руководство GLFW по настройке и конфигурации окна GLFW.

   Создание приложений: предоставляет отличную информацию о процессе компиляции/линкинга вашего приложения и большой список возможных ошибок (+ решения), которые могут возникнуть.

   GLFW с Code::Blocks: использование GLFW с Code::Blocks.

   Использование CMake: краткий обзор того, как запустить CMake в Windows и в Linux.

   Polytonic/Glitter: простой шаблонный проект, который предварительно настроен со всеми соответствующими библиотеками; отлично подойдёт, если вам нужен пример того, что можно сделать при помощи OpenGL, без необходимости компилировать все библиотеки самостоятельно.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (22 оценок, среднее: 4,59 из 5)
Загрузка...

Комментариев: 23

  1. Аватар Accellinker:

    У меня возникло много трудностей при подключении всех библиотек, используя эту статью.
    Для всех, у кого не получилось посмотрите это видео: https://www.youtube.com/watch?v=kGupc_M5o10
    Здесь все показывается. У меня решились проблемы.

    А автору спасибо за серию статей. Очень мало годных статей на тему OpenGL в интернете.

    1. Дмитрий Бушуев Дмитрий Бушуев:

      >>У меня возникло много трудностей при подключении всех библиотек

      Например?
      P.S.: Я сам несколько раз подключал с нуля все библиотеки по изложенным в статье шагам. Никаких проблем не было…

      1. Аватар Accellinker:

        Извиняюсь, мой недочет.
        Большинство ошибок были из-за моей невнимательности. Единственное, файл opengl32.lib в visual studio 2019 я так и не нашел. Но это решилось установкой SDK. Также CMake не находил студию 2017, однако это было решено переустановкой по другому пути.

        1. Дмитрий Бушуев Дмитрий Бушуев:

          Рад, что всё получилось 🙂

  2. Аватар Вадим:

    Здравствуйте, я сделал установку GLFW по вашей инструкции способом #2, Visual Studio не видит файл. Даже все директории переименовал как у вас. Всё равно. Тем не менее включая в папку Include glfw3.h все ошибки пропали. Это не критично?

    Чтобы убедиться: путь до директории include Visual Studio 2019: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include?

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Нет, абсолютно не критично.

      P.S.: Попробуйте открыть свой проект, далее в верхнем меню выбрать Проект->Свойства->Свойства конфигурации-> С/С++ -> Общие — > (справа)Дополнительные каталоги включаемых файлов, добавить путь к вашей папки с заголовочными файлами. На всякий случай вот для наглядности ссылка на картинку:
      https://ibb.co/d4T91dw

      1. Аватар Вадим:

        Здравствуйте! Уже 12 дней я пытался настроить GLFW и GLAD (Visual Studio не тянет прям никак) и пришёл к тому что в Code::Blocks проект собирается но только при изменении glad.h, glad.c, и собственно кода чтобы они все включали файлы по абсолютному пути. Это немного неудобно, как указать например относительный путь в моём коде к glfw.h который находится в папке проекта\include?

  3. Аватар Юрий:

    Доброго времени суток. Сделал установку по вашей инструкции. Возникла проблема со следующим сообщением в активной строке:

    Программа "[11520] 0у.exe" завершилась с кодом -1073741515 (0xc0000135) 'Зависимый DLL-файл не найден'.

    В выплывающем окне следующий текст:
    "Не удается продолжить выполнение кода, поскольку система не обнаружила glfw3.dll. Для устранения этой ошибки попробуйте переустановить программу.

    Подскажите, пожалуйста, как пофиксить

    1. Аватар SR000:

      Закинь в папку со своим 0у.exe файл glfw3.dll. Если ты не скомпилировал из исходников, то по ссылке на сайт GLFW скачай скомпилированную версию, согласно своей ОС. Этот файл будет в архиве.

    2. Дмитрий Бушуев Дмитрий Бушуев:

      Опишите подробнее, где конкретно появляется данная ошибка.

  4. Аватар Иван Сотников:

    Записал, что не получилось (и как устанавливал):
    https://youtu.be/mt_zGXXA4yw

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Добрый день.
      Посмотрел ваше видео. На днях я написал дополнение к данному уроку, в котором описал установку и настройку проекта с использованием CodeBlocks в Linux. Статья уже отправлена на рассмотрение Администратору и в ближайшее время она будет опубликована на сайте 🙂

      1. Аватар Иван Сотников:

        Понял. Спасибо.

  5. Аватар Арбузик❤❤❤:

    Жду с нетерпением следующий урок

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Обязательно будут. 🙂

  6. Аватар Кирилл:

    Здравствуйте, у меня возникла проблема при компиляции.
    В файле glad.h пишет: "директива #error: OpenGL header already included, remove this include, glad already provides it". Подскажите, пожалуйста, что делать?

    1. Дмитрий Бушуев Дмитрий Бушуев:

      На каком этапе урока происходит данная ошибка?

      1. Аватар Кирилл:

        На последнем этапе, когда пытаюсь подключить GLAD.

        1. Дмитрий Бушуев Дмитрий Бушуев:

          Можете выложить скриншот вашего кода с ошибкой компилятора?

      2. Аватар Кирилл:

        Я нашел в интернете как решить эту проблему. Сначала надо подключить GLAD, а только потом GLFW. Надо только было лучше погуглить

    2. Аватар mikasey:

      просто поставь инклюд glad.h перед glfw.h, ошибка происходит потому что второй отчасти зависит от первого, и если объявить его раньше то Glad будет ругаться. и вообще лучше объявляй его самым первым, потому что он и на другие библиотечные хэдеры может ругатьсяю

  7. Аватар Иван Сотников:

    Напишите, как установить на Debian 10 для Code::Blocks (или другой IDE).
    После нажатия на Configure выдал ошибку Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) . И нет папки build/src/Debug и файла glfw3.lib (искал по всему диску командой
    find / -iname "*glfw3*"
    , нету нигде.
    Не могу, в общем, разобраться.

    1. Дмитрий Бушуев Дмитрий Бушуев:

      >>После нажатия на Configure выдал ошибку Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)

      Добрый день.
      Самый простой способ решить проблему — это снять отметку с пункта GLFW_BUILD_DOCS (см. скриншот №3) и снова нажать Configure.

Добавить комментарий для Иван Сотников Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *