Русские Блоги
Прежде чем мы начнем рисовать отличный эффект, сначала нужно создать контекст OpenGL (Context) и окно для отображения. Однако эти операции различны в каждой системе, и OpenGL целенаправленно абстрагируется от этих операций. Это означает, что мы имеем дело с созданием окон, определением контекста OpenGL и обработкой пользовательского ввода.
К счастью, есть некоторые библиотеки, которые уже предоставляют нужные нам функции, некоторые из которых специально для OpenGL. Эти библиотеки экономят нам время на написание кода, связанного с операционной системой, и предоставляют нам окно и контекст для рендеринга. Наиболее популярными библиотеками являются GLUT, SDL, SFML и GLFW. В уроке мы будем использоватьGLFW。
GLFW — это библиотека языка C, специально предназначенная для OpenGL, которая предоставляет некоторые минимальные интерфейсы, необходимые для визуализации объектов. Он позволяет пользователям создавать контексты OpenGL, определять параметры окна и обрабатывать пользовательский ввод, что именно то, что нам нужно.

Цель этого и следующего разделов — создать среду GLFW и убедиться, что она правильно создает контекст OpenGL и отображает окна. Этот урок начнется с получения, компиляции и компоновки библиотеки GLFW шаг за шагом. Мы используем Microsoft Visual Studio 2015 IDE (процесс работы такой же, как и в новой версии Visual Studio). Если вы не используете Visual Studio (или его более старую версию), не беспокойтесь, большинство операций в IDE схожи.
Сборка GLFW
GLFW можно скачать с официального сайтаСкачать страницуЛадить. GLFW уже имеет предварительно скомпилированные двоичные версии и соответствующие файлы заголовков для Visual Studio 2013/2015, но для полноты мы начнем с компиляции исходного кода. Итак, нам нужно скачать32-битный пакет с исходным кодом。
После загрузки исходного пакета разархивируйте и откройте его. Нам нужно только это содержимое:
- Скомпилируйте сгенерированную библиотеку
- includeпапка
Компиляция библиотеки из исходного кода может гарантировать, что сгенерированная библиотека совместима с вашей операционной системой и процессором, а у предварительно скомпилированных двоичных файлов могут быть проблемы с совместимостью (даже иногда они не предоставляют файлы, которые поддерживают вашу систему). Одна проблема с предоставлением исходного кода заключается в том, что не все используют одну и ту же среду разработки для разработки программ, поэтому предоставленные файлы проекта / решения могут быть несовместимы с некоторыми людьми. Поэтому люди могут создавать свои собственные проекты / решения только из файлов .c / .cpp и .h / .hpp, что является скучной работой. Но в результате появился инструмент под названием CMake.
CMake
CMake — это инструмент для создания файлов проекта. Пользователи могут использовать предопределенные сценарии CMake для создания файлов проекта для различных сред IDE в соответствии с их выбором (например, Visual Studio, Code :: Blocks, Eclipse). Это позволяет нам создать файл проекта Visual Studio 2015 из исходного кода GLFW и затем скомпилировать его. Во-первых, нам нужно начатьВотСкачайте и установите CMake. Я выбрал установщик Win32.
Когда CMake успешно установлен, вы можете запустить CMake из командной строки или с помощью графического интерфейса. Поскольку я не хочу усложнять задачу, мы решили использовать графический интерфейс. CMake нужен каталог исходного кода и каталог целевого файла для хранения скомпилированных результатов. Каталог с исходным кодом Мы выбираем корневой каталог исходного кода GLFW, а затем создаем новыйbuild Папка, выбранная в качестве целевого каталога.

После установки каталога исходного кода и целевого каталога нажмитеНастройкаКнопка, чтобы позволить CMake прочитать настройки и исходный код. Далее нам нужно выбрать генератор проекта. Так как мы используем Visual Studio 2015, мы выбираемVisual Studio 14 Опция (поскольку внутренний номер версии Visual Studio 2015 равен 14), выберите платформу какWindow2, CMake отобразит дополнительные параметры компиляции для настройки окончательно сгенерированной библиотеки. Здесь мы используем настройки по умолчанию и нажимаем еще разНастройкаКнопка для сохранения настроек. После сохранения нажмитегенерироватьКнопка, сгенерированный файл проекта будет в вашемbuildПапка.
Compile
вbuildМожно найти в папкеGLFW.slnФайл, открытый в Visual Studio 2015. Поскольку CMake уже настроил проект, мы просто нажимаемПостроить решениеКнопка, а затем скомпилировать библиотекуglfw3.lib(Обратите внимание, что мы используем версию 3) появится вsrc/DebugПапка.
После того, как библиотека сгенерирована, нам нужно сообщить IDE, где находится библиотека и файлы заголовков. Есть два способа:
- Найти IDE или компилятор/libс участием/includeПапка, добавь GLFWincludeФайлы в папке в IDE/includeПерейти в папку. Подобным образом,glfw3.libдобавить к/libПерейти в папку. Хотя это работает, это не рекомендуемый способ, поскольку вам будет сложно управлять библиотеками и включаемыми файлами, а переустановка IDE или компилятора может привести к потере этих файлов.
- Рекомендуемый способ — создать новый каталог, содержащий все сторонние библиотечные файлы и файлы заголовков, и указать эти папки в вашей IDE или компиляторе. Я лично использую отдельную папку, которая содержитLibsс участиемIncludeПапка, в которой хранятся все сторонние библиотеки и файлы заголовков, используемые в проекте OpenGL. Таким образом, все мои сторонние библиотеки находятся в одном месте (и могут использоваться несколькими компьютерами). Однако для этого необходимо указывать IDE / компилятору, где искать эти каталоги каждый раз, когда вы создаете новый проект.
Выполнив вышеуказанные шаги, мы можем использовать GLFW для создания нашего первого проекта OpenGL!
Наш первый проект
Сначала откройте Visual Studio и создайте новый проект. Если VS предоставляет несколько параметров, выберите Visual C ++, а затем выберитеПустой проект(Не забудьте дать вашему проекту подходящее название). Теперь, когда у нас наконец есть пустое рабочее пространство, давайте создадим нашу первую программу OpenGL!
ссылка на сайт
Чтобы наша программа использовала GLFW, нам нужно связать библиотеку GLFW с проектом. Это можно сделать, указав в настройках компоновщика, который мы хотим использоватьglfw3.libДля завершения, но поскольку мы помещаем стороннюю библиотеку в другой каталог, наш проект не знает, где найти этот файл. Поэтому сначала нужно добавить каталог, куда мы помещаем стороннюю библиотеку в настройки.
Чтобы добавить эти каталоги (где VS необходим для поиска библиотек и включаемых файлов), мы сначала вводим Свойства проекта (щелкните правой кнопкой мыши проект в окне решения), а затем выбираемКаталоги VC ++ (каталог VC ++)Вкладка (как показано ниже). Добавьте каталоги в следующие два столбца:

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

Здесь можно добавить любое количество каталогов, и среда IDE будет искать файлы заголовков в этих каталогах. Так что, пока вы добавляете GLFWIncludeДобавить папку в путь, вы можете использовать <GLFW/..> Цитировать заголовочный файл. Папка библиотеки такая же.
Теперь VS может найти все необходимые файлы. Последнее должно бытьЛинкер (линкер)Во вкладкевходДобавить во вкладкуglfw3.libЭтот файл:

Чтобы связать библиотеку, мы должны сообщить компоновщику ее имя файла. Название библиотекиglfw3.libМы добавляем это кДополнительные зависимостиПоле (вручную или с помощью параметров в порядке). Тогда GLFW будет связан при компиляции. В дополнение к GLFW вам также необходимо добавить ссылку для ссылки на библиотеку OpenGL, но эта библиотека может иметь некоторые различия из-за разных систем.
Библиотека OpenGL в Windows
Если вы на платформе Windows,opengl32.libОн уже включен в Microsoft SDK и устанавливается по умолчанию при установке Visual Studio. Поскольку в этом руководстве используется компилятор VS и используется операционная система Windows, нам нужно толькоopengl32.libПросто добавьте его в настройки разъема.
На этом установка и настройка GLFW заканчивается.
Это еще не конец, у нас еще есть одна вещь, чтобы сделать. Поскольку OpenGL является только стандартом / спецификацией, конкретная реализация реализована разработчиком драйвера для конкретной видеокарты. Из-за большого количества версий драйвера OpenGL местоположение большинства его функций не может быть определено во время компиляции, и его необходимо запрашивать во время выполнения. Таким образом, задача ложится на разработчика, которому необходимо получить адрес функции во время выполнения и сохранить его в указателе функции для дальнейшего использования. Как получить адресЗависит от платформы, Это будет выглядеть так на Windows:
Вы можете видеть, что код очень сложный и громоздкий, и нам нужно повторить этот процесс для каждой возможной функции. К счастью, есть библиотеки, которые упрощают этот процесс, среди которыхGLADВ настоящее время самая последняя и самая популярная библиотека.
Настроить GLAD
GLAD являетсяОткрытый источникБиблиотека, она может решить громоздкую проблему, о которой мы говорили выше. Конфигурация GLAD немного отличается от большинства библиотек с открытым исходным кодом. GLAD используетИнтернет Сервис, Здесь мы можем сообщить GLAD версию OpenGL, которую необходимо определить, и загрузить все связанные функции OpenGL на основе этой версии.
Открыть GLADИнтернет СервисУстановите язык (Language) наC/C++В опциях API выберите3.3Вышеупомянутая версия OpenGL (gl) (мы будем использовать версию 3.3 в нашем уроке, но более новая версия также будет работать). Затем установите профиль (профиль) вCoreИ гарантияСоздать загрузчикОпция (Создать загрузчик) выбрана. Теперь вы можете (временно) игнорировать содержимое в расширениях. Выбрав все, нажмитегенерироватьКнопка (Создать) для создания файлов библиотеки.
GLAD теперь должен предоставить вам zip-файл, содержащий две директории с заголовочными файлами, иglad.cфайл. Две директории с заголовочными файлами (gladс участиемKHR) Скопировано на вашIncludeПапка (или добавить дополнительный элемент, чтобы указать на эти каталоги), и добавитьglad.cФайл в ваш проект.
После предыдущих шагов вы сможете добавить следующие команды в начало вашего файла:
Нажатие на кнопку компиляции не должно давать вам никаких ошибок, теперь мы готовы продолжить обучениеСледующий разделВ действительности используйте GLFW и GLAD для настройки контекста OpenGL и создания окна. Не забудьте убедиться, что параметры каталогов ваших заголовочных файлов и библиотечных файлов правильные, а имена библиотечных файлов, указанные в компоновщике, верны. Если вы по-прежнему сталкиваетесь с ошибками, вы можете сначала проверить комментарии, если кто-то сталкивался с подобными проблемами, обратитесь к примерам в дополнительных ресурсах или задайте вопросы в разделе комментариев ниже.
Glad opengl что это
GLEW(OpenGL Extension Wrangler Library);
When writing OpenGL code, if you want static linking, you must include this preprocessing macro
And if you compile with GCC glew with glfw For dynamic libraries, you can use the command line:
SOIL(Simple OpenGL Image Library),download;
Before the demo starts, we have to quote today glad Library, the role of this library is glew Similarly, glad is compared with glew. Simply put, glad is an upgraded version of glew. It was released in September 2018. Our subsequent examples will be based on the glad library.
In the demo, we will also include the source code of the glad, we can see all the integrated functions of the glad, which is actually the encapsulation of the opengl api, but because some functions need to be called continuously, many encapsulated ones are produced Tool library, like glut before, to glew, and then to the glad we will use. These toolkits appear for cross-platform, it hides the details of calling opengl api under different platforms.
Add to glad Library
Add two glad files to the project:

Of course for glad Refer to other libraries, find a way to solve this problem yourself, otherwise you will encounter the same problem sooner or later; those who need libraries go here to findYou will find a big treasure! ! !
First introduce our library file, configure header search path :

Add in the code:
Here we forget one item, that is, the following dynamic library link, don’t forget, otherwise, a bunch of functions will be reported to you without this symbol;

Command + B Verification passed!
Build our window
The content related to glfwWindow will not be explained in detail here, and go directly to opengl. As for glfwWindowHint The meaning of the enumeration value in the parameter can be seenhttps://www.glfw.org/docs/latest/window.html#window_hints
One thing to note here is that if it is an Apple system, you need to add the following line:
glfw initialization
Create window object
Determine whether the creation is successful, and finally save the context;
At this time we can create a window, you can run it if you don’t believe me;
Window change callback
Before OpenGL rendering, we must define the viewport, so here is to be distinguished from the window, because in OpenGL there is no concept of window at all, rendering in OpenGL must define the viewport (if not defined, you guess what will happen) ;
glfw You can set different callback functions for the window. Specifically, we have encountered one by one explanation, here is a window change callback:
we are at main The monitoring window changes in the function, when glfw Call back to our own writing when the window changes framebuffer_size_callback , Here we let the viewport follow the window size change;
GLAD pointer
The next paragraph is not very clear, I have always wanted to bypass glut/glew/glad Such libraries, but it seems that OpenGL internally needs to save pointers externally to modify OpenGL, so these libraries are necessary here, specifically why we will discuss it later in the learning process, the focus now is to get through the main path of rendering;
Render loop
Next to the main rendering loop, explain one by one:
Whether to exit glfw every time loop, if it returns 0, then close the application directly:
The following function will check the trigger event in each loop. According to some hardware of the platform, which callbacks will be discussed later;
Here I want to talk about the concept of double buffering, understand for yourself: 
our process_input Is an actively called function, in each loop we will get the keyboard keys, when pressed ESC Close the window directly when;
Render
Finally, we have to do the most primitive rendering action, which is the first step into OpenGL, change the color in the viewport, and constantly change the viewport color in the loop:
learnopengl. Урок 1.2 — Создание окна
В прошлом уроке мы разобрались с тем, что такое OpenGL. В этом уроке мы поговорим о причине необходимости использования GLFW, GLEW и CMake, а также рассмотрим как их использовать. А также освежим в памяти, разницу между статической и динамической линковкой.
Заинтересовавшихся прошу под кат.
Часть 1.2 — Создание окна
Прежде чем начать создавать умопомрочительную графику нам надо создать контекст и окно приложения, в котором мы будет эту графику рисовать. Но, к сожалению, эти операции специфичны для каждой операционной системы и OpenGL всеми силами старается абстрагироваться от этих операций. Это означает, что создавать окно, определять контекст и работать с пользовательским вводом нам придется самим.
GLFW — это библиотека, написанная на C, специально нацеленная для предоставления OpenGL самого необходимого для отрисовки контента на экран. Она позволяет нам создать контекст, определить параметры окна и работать с пользовательским вводом, а это все что там сейчас нужно.
В основном в этом и следующем уроке мы будем заставлять GLFW нормально работать, проверять правильность создания OpenGL контекста и производить отрисовку окна в котором мы будет рисовать графику. Этот урок пошагово расскажет о сборке и линковке GLFW библиотеки. Для этого урока мы будем использовать Microsoft Visual Studio 2012 (заметьте, что процесс будет мало отличаться для других версий VS). Если вы не используете VS — то не волнуйтесь, этот процесс очень похож для всех IDE.
Сборка GLFW
GLFW можно скачать со страницы загрузки официального сайта. GLFW поставляется с прекомпилированными бинарниками и заголовочными файлами для VS, но для полноты картины мы соберем GLFW собственноручно. Так что давайте скачаем пакет с исходным кодом (Source package).
После того, как вы скачаете пакет — разархивируйте его. Нам интересны следующие элементы:
- Результат компиляции
- Папка include
CMake
CMake — это инструмент для генерации файлов Проекта/Решения для IDE, выбранного пользователем (Visual Studio, Code::Blocks, Eclipse) из набора исходных кодов и CMake скриптов. Такая конфигурация позволяет сгенерировать Visual Studio 2012 проектные файлы, чтобы мы могли без труда собрать библиотеку. Для начала нам надо скачать CMake, сделать это можно на странице загрузки. Я использую Win32 установщик.
Как только CMake установится, вы сможете выбрать запуск CMake из консоли или в качестве графического приложения. Так как мы стараемся не перегружать уроки — то мы выберем графическое приложение. CMake требует указать директорию с исходным кодом и папку, куда будет записан результат в виде бинарных файлов. В качества директории с исходным кодом мы укажем корневую папку разархивированного GLFW пакета с исходным кодом, а в качестве папки для бинарных файлов мы укажем новую директорию <build.

После установки требуемых директорий, нажмите Configure, что бы CMake считал требуемые настройки и исходный код. Затем нам требуется выбрать генератор для проекта. Так как мы собираемся использовать Visual Studio 2012 мы выбираем Visual Studio 11 (Visual Studio 2012 также известна как Visual Studio 11). Далее CMake отобразит возможные настройки сборки, их можно оставить без изменения, нажав еще раз на Configure для их сохранения. После сохранения настроек можем приступать к генерации проекта, для этого нажмите на Generate и в папке build будут созданы файлы проекта.
Компиляция
В папке build появился файл GLFW.sln, открываем его Visual Studio. CMake должен был сгенерировать проект со всеми требуемыми настройками, поэтому просто начинаем сборку, нажимая на Build Solution и в качестве результата мы получае glfw3.lib (мы используем 3 версию) в папке src/Debug,
После того, как библиотека сгенерировалась надо удостовериться, что IDE знает где искать библиотеку и заголовочные файлы. Есть 2 способа сделать это:
-
Мы ищем /lib и /include папки IDE или Компилятора и добавляем туда папку include и libиз GLFW. Это будет работать, но так лучше не делать. Такой метод сложно отследить и вы потеряете все файлы при переустановке или смене компилятора/IDE.
Наш первый проект
Для начала давайте откроем Visual Studio и создадим новый проект. Выберите Visual C++ и Пустой проект (не забудьте выдать проекту приемлемое имя). Теперь у нас есть рабочее пространство для создания нашего первого приложения с использованием OpenGL.
Линковка
Для использования GLFW нам также требуется его связать с нашим проектом. Это делаеться, указанием, что мы хотим использовать glfw3.lib в настройках линковщика, но наш проект все еще не знает, где искать glfw3.lib (если вы не выбрали 1 вариант во время решения проблемы с местонахождением файлов библиотек), соответственно нам надо добавить эти директории в проект.
Мы можем добавить те директории, для этого перейдите в VC++ Directories, как показано на изображении ниже:

И оттуда вы можете добавить собственные директории, чтобы проект знал где искать требуемые файлы. Это можно сделать ручным способом, просто вставив путь в текстовое поле, либо нажав на Edit…, где вы сможете добавить значения в специальном окне.

Здесь вы можете добавить такое количество директорий, какое вам захочется, а IDE также будет искать требуемые файлы там. Теперь, когда Include папка указана для среды вы сможете найти все требуемые заголовочные файлы GLFW в <GLFW/..>. Тоже самое применимо и для директории с библиотеками.
И уже после того, как Visual Studio узнал, где искать требуемые библиотеки, мы наконец можем связать GLFW и наш проект:

Здесь требуется указать название линкуемой библиотеки, в нашем случае это glfw3.lib и добавляем мы ее в поле Additional Dependencies (сделать это также можно изменив руками или использовав кнопку <Edit…>) и теперь GLFW будет линковаться к проекту во время компиляции. Также требуется указать OpenGL библиотеки, но этот процесс отличается для разных ОС.
OpenGL библиотека для Windows
Если вы используете Windows — то библиотека, называющаяся opengl32.lib поставляется с Microsoft SDK, которая ставится по умолчанию при установке Visual Studio. Так как в этом уроке мы и так использует Visual Studio — то здесь будет достаточно просто добавить opengl32.lib в настройки линковщика.
OpenGL библиотека для Linux
На Linux системах вам требуется использовать libGL.so библиотеку, использовав флаг -lGL в настройках линковщика. Если вы не можете найти эту библиотеку — то вам, вероятно, требуется поставить Mesa, NVidia или AMD dev пакеты, но я не буду вдаваться в подробности, так как это очень специфично для платформы (плюс я не являюсь Linux экспертом).
По окончанию добавления GLFW и OpenGL библиотеки в настройки линковщика вы можете подключать GLFW следующим образом:
Это финальный этап установки и настройки OpenGL.
Но мы еще не закончили с настройкой OpenGL. Кое что еще придется сделать. Поскольку OpenGL — это лишь спецификация — то реализация ложится на плечи разработчиков видеокарт. По этой причине, поскольку существует множество реализаций OpenGL реальное расположение OpenGL функций не доступно на этапе компиляции и их приходится получать на этапе исполнения. Фактически получение адресов функций ложится на плечи программиста. Процесс получения адресов специфичес для каждой платформы, для Windows это выглядит примерно так:
Как вы можете заметить код выглядит довольно запутанным, а необходимость производить получение адреса для каждой OpenGL функции делает этот процесс просто мучительным. Но к счастью существуют библиотеки реализующие эту динамическую линковку и одной из самых популярных библиотек является GLEW
Сборка и линковка GLEW
GLEW расшифровывается как OpenGL Extension Wrangler Library и управляем всей той громоздкой работой о которой говорилось выше. Поскольку GLEW это тоже библиотека — то нам опять придется собрать ее и связать с нашим проектом. GLEW может быть скачан с официальной страницы, там вы найдете как уже прекомпилированные библиотеки, так и исходный код. И опять же повторюсь: если вы не уверены какую битность использовать — используйте 32 битную версию.
Мы будем использовать статическую версию GLEW, которая называется glew32s.lib (заметьте приставку `s`). Поэтому добавьте ее в вашу папку с библиотеками, а также добавьте заголовочные файлы в вашу папку с заголовочными файлами. Теперь мы можем линкануть GLEW к проекту, добавив glew32s.lib в настройки линковщика в Visual Studio. Заметьте, что GLFW3 по умолчанию собирается как статическая библиотека.
Статическая линковка означает, что библиотека будет интегрирована с исполняемым файлом во время компиляции. Преимущество такого подхода в том, что вам не нужно следить за дополнительными файлами, помимо исполняемого файла. Недостатки такого подхода состоят в том, что исполняемый файл увеличивается в размерах и что при обновлении библиотеки вы вынуждены пересобирать исполняемый файл.
Динамическая линковка осуществляется посредством .dll и .so файлов, осуществляя разделение кода библиотеки и кода приложения, уменьшая размер исполняемого файла и упрощая обновление библиотеки. Недостатком такого подхода является тот факт, что вам придется выпускать DLL файлы вместе с финальным приложением.
Если вы хотите использовать GLEW как статическую библиотеку — то перед подключением GLEW следует задать переменную препроцессора GLEW_STATIC.
Если вы хотите динамическое связывание — то вы можете опустить задачу переменной препроцессора GLEW_STATIC. Помните, что если вы используете динамическое связывание то вам придется скопировать .DLL файл в папку с исполняемым файлом.
Для пользователей Linux, собирающих проект с помощью GCC в сборке могут помочь следующие ключи:
-lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi.
Неправильное использование данных ключей может привести к большому количеству неопределенного поведения.
Теперь, когда мы наконец то собрали и связали GLFW и GLEW у нас все готово для следующего урока в котором мы обсудим как использовать GLFW и GLEW для настройки OpenGL контекста и создания окна. Удостоверьтесь, что ваши директории с заголовочными файлами и файлами библиотек указаны верно и что в названиях библиотек в настройках линковщика нет ошибок. Если вы застряли — проверьте комментарии к исходной статье или другие источники, возможно вы допустили некоторую специфическую ошибку.