learnopengl. Урок 1.2 — Створення вікна

У минулому уроці ми розібралися з тим, що таке OpenGL. У цьому уроці ми поговоримо про причини необхідності використання GLFW, GLEW і CMake, а також розглянемо як їх використовувати. А також освяжим в пам'яті, різницю між статичною та динамічною линковкой.

Зацікавлених прошу під кат.

Меню
1. Починаємо

  1. OpenGL
  2. Створення вікна
Частина 1.2 — Створення вікна
Перш ніж почати створювати умопомрочительную графіком нам треба створити контекст і вікно програми, в якому ми цю графіком малювати. Але, на жаль, ці операції специфічні для кожної операційної системи і OpenGL всіма силами намагається абстрагуватися від цих операцій. Це означає, що створювати вікно, визначати контекст і працювати з користувальницьким введенням нам доведеться самим.

GLFW
GLFW — це бібліотека, написана на C, спеціально націлена для надання OpenGL самого необхідного для відтворення контенту на екран. Вона дозволяє нам створити контекст, визначити параметри вікна і працювати з користувальницьким введенням, а це все що там зараз потрібно.

В основному в цьому і наступному уроці ми будемо змушувати GLFW нормально працювати, перевіряти правильність створення OpenGL контексту і виробляти малювання вікна в якому ми буде малювати графіку. Цей урок покроково розповість про складання і лінкування GLFW бібліотеки. Для цього уроку ми будемо використовувати Microsoft Visual Studio 2012 (зауважте, що процес буде мало відрізнятися для інших версій VS). Якщо ви не використовуєте VS — не хвилюйтеся, цей процес дуже схожий для всіх IDE.

Збірка GLFW
GLFW можна скачати сторінки завантаження офіційного сайту. GLFW поставляється з прекомпилированными бинарниками і заголовочными файлами для VS, але для повноти картини ми зберемо GLFW власноруч. Так що давайте завантажити пакет з вихідним кодом (Source package).

Якщо ви використовуєте прекомпилированные бінарники — переконайтеся, що ви завантажили 32 бітну версію, а не 64 бітну. (Якщо ви не знаєте в чому суттєва різниця). Так як 64 бітна версія генерує досить дивна поведінка для більшості читачів.
Після того, як ви скачаєте пакет — розархівуйте його. Нам цікаві такі елементи:

  • Результат компіляції
  • Папка include
Збірка бібліотеки з вихідного коду гарантує, що результуюча бібліотека буде ідеально працювати на вашому CPU/OS, чого не можна сказати про поставляються прекомпилированные бібліотеки (іноді вони навіть просто недоступні для вашої системи). Основна проблема надання вихідного коду світу, що далеко не всі використовують одну і ту ж IDE для розробки їх застосування, що означає, що Проектні файли можуть бути просто несумісні з іншими IDE. І через це людям доводиться руками збирати власні проекти, що, очевидно, не дуже зручно. Спеціально для того, щоб уникнути цієї проблеми був придуманий CMake.

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 способи зробити це:

  1. Ми шукаємо /lib та /include папки IDE або Компілятор і додаємо туди папку include та libз GLFW. Це буде працювати, але так краще не робити. Такий метод складно відстежити і ви втратите всі файли при перевстановлення або зміну компілятора/IDE.

  2. Рекомендований спосіб — це створити набір каталогів, що містять всі відмінності файли і бібліотеки від третіх осіб до яких ви могли б звертатися при використанні вашого IDE або Компілятора. Особисто я використовую одну папку, яка містить теки Libs та Include де я зберігаю всі свої відмінності файли та бібліотеки для OpenGL проектів. Тепер всі мої бібліотеки від третіх осіб зібрані в одному місці (і їх легко переміщати між різними PC). Єдиний недолік — необхідність для кожного нового проекту вказувати місце розташування цієї папки.
По завершенню вибраного вами дії можна перейти до створення нашого першого OpenGL проекту з GLFW.

Наш перший проект
Для початку давайте відкриємо 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 наступним чином:

#include <GLFW\glfw3.h>

Це фінальний етап установки і налаштування OpenGL.

GLEW
Але ми ще не закінчили з налаштуванням OpenGL. Дещо ще доведеться зробити. Оскільки OpenGL — це лише специфікація — то реалізація лягає на плечі розробників відеокарт. З цієї причини, оскільки існує безліч реалізацій OpenGL реальне розташування OpenGL функцій не доступно на етапі компіляції і їх доводиться отримувати на етапі виконання. Фактично отримання адрес функцій лягає на плечі програміста. Процес отримання адрес специфічні для кожної платформи, для Windows це виглядає приблизно так:

// Визначаємо прототип функції
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// Знаходимо цю функцію в реалізації і зберігаємо вказівник на неї
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// Тепер ми можемо нормально викликати цю функцію
GLuint buffer;
glGenBuffers(1, &buffer);

Як ви можете помітити код виглядає досить заплутаним, а необхідність виробляти отримання адреси для кожної функції 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.

#define GLEW_STATIC
#include < GL/glew.h>

Якщо ви хочете динамічне зв'язування — то ви можете опустити завдання змінної препроцесора GLEW_STATIC. Пам'ятайте, що якщо ви використовуєте динамічне зв'язування то вам доведеться скопіювати .DLL файл в папку з виконуваним файлом.

Для користувачів Linux, збирають проект з допомогою GCC у складанні можуть допомогти наступні ключі:

-lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi.

Неправильне використання даних ключів може призвести до великої кількості невизначеного поведінки.
Тепер, коли ми нарешті зібрали і зв'язали GLFW і GLEW у нас все готово для наступного уроку в якому ми обговоримо як використовувати GLFW і GLEW для налаштування OpenGL контексту і створення вікна. Переконайтеся, що ваші директорії з заголовочными файлами і файлами бібліотек зазначені вірно і що у назвах бібліотек у налаштуваннях зв'язування немає помилок. Якщо ви застрягли — перевірте коментарі до вихідної статті або інші джерела, можливо, ви допустили деяку специфічну помилку.

Додаткові ресурси
  • Збірка додатків: надає докладну інформацію про процесі лінкування і компіляції програми з великою кількістю різних можливих помилок;
  • GLFW з Code::Blocks: збірка GLFW в Code::Blocks IDE;
  • Запуск CMake: невеликий урок про запуск CMake під Windows та Linux;
  • Написання складальної системи під Linux: урок за autotools від Wouter Verholds описує процес написання системи збирання в Linux спеціально налаштованих для цих уроків;
  • Polytonic/Glitter: простий шаблонний проект, який поставляється перед-налаштованим з всемы необхідними бібліотеками; ідеальний, якщо ви хочете побачити приклад повністю працюючого LearnOpenGL проекту.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.