OpenGL-Підручник. Урок 1. Створення вікна

Передмова
Якщо з'являється бажання почати вивчати OpenGL — то найчастіше натикаєшся на уроки NeHe і відразу починаєш із застарілого OpenGL. Але в інтернеті є хороший набір уроків за новим OpenGL 3.3, підтримуваний співтовариством. Сам набір розділений на 3 групи: Базові уроки, Просунуті і Всяке. Я постараюся випускати по статті на кожен урок, а на початку кожної статті буду залишати невеликий вміст. Спасибі.

Зміст

Базові уроки:
  • Урок 1. Створення вікна
  • Урок 2. Перший трикутник
  • Урок 3. Матриці
  • Урок 4. Кольоровий куб
  • Урок 5. Текстурований куб
  • Урок 6. Клавіатура і миша
  • Урок 7. Завантаження моделей
  • Урок 8. Базовий шейдинг
Просунуті:
  • Урок 9. VBO індексація
  • Урок 10. Прозорість
  • Урок 11. 2D текст
  • Урок 12. Розширення OpenGL
  • Урок 13. Normal Mapping
  • Урок 14. Вивід на текстуру
  • Урок 15. Lightmaps
  • Урок 16. Shadow mapping
  • Урок 17. Обертання
  • Урок 18.1. «Білборди»
  • Урок 18.2. Частинки
Всяке:
  • Урок 9. VBO індексація
  • Урок 10. Прозорість
  • Урок 11. 2D текст
  • Урок 12. Розширення OpenGL
  • Урок 13. Normal Mapping
  • Урок 14. Вивід на текстуру
  • Урок 15. Lightmaps
  • Урок 16. Shadow mapping
  • Урок 17. Обертання
  • Урок 18.1. «Білборди»
  • Урок 18.2. Частинки


Стаття
Вступ
Ласкаво просимо на перший урок.

Перш ніж перейти до OpenGL Вам треба навчитися збирати код, який йде до кожного уроку, навчитися запускати його, і що більш важливо, навчитися працювати з цим кодом самостійно.

Вимоги
Ніяких особливих вимог для цих уроків не потрібно. Бажано мати досвід роботи з будь-якою мовою програмування (C, Java, Lisp, Javascript і т. д.), для того, що б повністю розуміти код, але це не обов'язково. Просто буде складніше навчати відразу 2 речі.

Усі уроки написані на «Легкому С++»: Багато зусиль було докладено для того, що б зробити код максимально простим. Немає шаблонів, ні класів, ні покажчиків. Так Ви зможете зрозуміти все, навіть якщо знаєте тільки Java.

Забудьте все
Вам не потрібно нічого знати, але якщо Ви щось знаєте про OpenGL, забудьте це. Якщо Ви знаєте щось про glBegin(), забудьте це. Тут Ви будете вивчати сучасний OpenGL (OpenGL 3 і 4), а більшість уроків, які Ви можете знайти в інтернеті — за старим OpenGL (OpenGL 1 і 2).
Так що забудьте все, що Ви можете знати про OpenGL, інакше у вас мозок скипить від змішування різних стандартів.

Збірка
Усі уроки можуть бути зібрані на Windows, Linux і Mac. Для всіх цих платформ, процедура одна і та ж:
  • Оновити драйвера. Вас попередили
  • Скачайте компілятор, якщо у вас ще немає його
  • Виберіть CMake
  • Завантажити вихідний код уроків
  • Згенеруйте проект з допомогою CMake
  • Зберіть його
  • Поиграйтесь з прикладами!


Детальніше, алгоритми складання під різні платформи представлені нижче:

Збірка під Windows
  • Оновити драйвера повинно бути просто. Просто скачайте драйвера з сайту AMD або NVidia, в залежності від вашої відеокарти. Якщо ви не впевнені в тому, GPU якій компанії у вас стоїть: Панель управління -> Система і Безпека -> Система -> Диспетчер пристроїв -> Відеочіп. Якщо у вас інтегрована відеокарта Intel — то драйвера часто надаються виробником (Dell, HP і т. д.)
  • Ми радимо використовувати Visual Studio 2015 Express for Desktop як компілятора. Ви можете завантажити його безкоштовно звідси. Якщо Ви віддаєте перевагу MinGW, тоді рекомендуємо використовувати QtCreator. Встановлюйте в залежності від ваших уподобань. Подальше вказівки будуть дані для Visual Studio. Адаптуйте їх для вашої IDE.
  • Скачайте CMake та встановіть його.
  • Завантажте вихідний код і разархивирейте його до прикладу в C:\Users\XYZ\Projects\OpenGLTutorials\
  • Запустіть CMake. У першому рядку введіть шлях до папки з вихідними кодами. У вказаній Вами теці повинен знаходитися CMakeLists.txt. У другому рядку вкажіть шлях, в який будуть збережені результати роботи CMake.
  • Натисніть на кнопку «Configure». Оскільки це перша налаштування проекту, CMake запитає, який компілятор Ви хочете використовувати. Вибирайте мудро, грунтуючись на першому кроці. Якщо у вас 64 бітна версія Windows, Ви можете вибрати 64 бітний компілятор. Якщо Ви не впевнені, вибирайте 32 бітний.
  • Натисніть на кнопку «Configure» до тих пір, поки всі червоні рядки не пропадуть. Далі натисніть на кнопку «Generate». Проект Visual Studio створений. Тепер Ви можете забути про CMake.
  • виберіть папку, яку Ви вказали у другому рядку. Знайдіть там файл Tutorials.sln. Відкрийте його за допомогою Visual Studio.
  • У меню «Build» натисніть «Build All». Всі уроки і залежно скомпільовані. Всі виконувані файли були скопійовані в папку з уроком. Сподіваюся помилок не виникло.
  • виберіть файл playground.exe і з'явиться чорне вікно.
Ви також можете запустити кожен урок прямо з Visual Studio. Для цього натисніть правою кнопкою миші на уроці, виберіть «Choose as startup project». Тепер можете налагоджувати його за допомогою F5.


Збірка під Linux
Існує дуже велика кількість різних дистрибутивів Linux і просто неможливо описати процес складання для кожної конкретної платформи. Ось загальна процедура. Адаптуйте її для свого дистрибутива:
  • Виберіть останні драйвера. Ми дуже рекомендуємо бінарні драйвера з закритим вихідним кодом. Вони не відкриті, але вони працюють. Якщо ваш дистрибутив не надає автоматичну установку, спробуйте урок з сайту Ubuntu.
  • Виберіть необхідні компілятори, інструменти та бібліотеки. Повний список: cmake make G++ libx11-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libxrandr-dev libxext-dev libxi-dev.
    sudo apt-get install *****
    або
    su && yum install ******
  • Завантажте вихідний код і розархівуйте його.
  • Перейдіть в папку з проектом і виконайте такі команди:
  • mkdir build
  • cd build
  • cmake ..
  • Makefile був створений у build папці.
  • Команда «make all» збере всі уроки і їх залежності. Всі виконувані файли будуть скопійовані в папку з проектом.
  • Запустіть файл ./playground. Повинно з'явитися чорне вікно.


Зауважте, що Ви також можете використовувати IDE, начебто QtCreator. Головне, що б вона підтримувала CMake. Ось інструкція для QtCreator:
  • QtCreator відкрийте File -> Tools — > Options -> Compile&Execute -> CMake
  • Виберіть шлях до CMake. Найчастіше це /usr/bin/cmake
  • File — > Open Project; Виберіть tutorials/CMakeLists.txt
  • Виберіть папку для збірки. Бажано вона повинна бути поза папки tutorials.
  • Можете встановити прапор -DCMAKE_BUILD_TYPE=Debug у параметрах.
  • Натисніть на Молот внизу. Усі уроки будуть зібрані
  • Для запуску уроків з QtCreator, натисніть на Projects -> Execution parameters -> Working Directory і виберіть папку, де знаходяться шейдери, текстури і моделі.


Збірка під Mac
Процес дуже схожий зі збіркою під Windows. (Makefile також підтримуються, але тут вони не описані).
  • Виберіть XCode з Mac App Store
  • Скачайте CMake і встановіть .dmg файл. Вам не треба встановлювати інструменти командного рядка
  • Завантажте вихідні коди і розархівуйте їх
  • Запустіть CMake (Applications -> CMake). А першому рядку вкажіть шлях до проекту. У цій папці повинен знаходитися файл CMakeLists.txtю У другому рядку вкажіть шлях до папки, в яку будуть зберігатися результати роботи CMake.
  • Натисніть на кнопку «Configure». Оскільки це перша налаштування проекту, CMake запитає, який компілятор Ви хочете використовувати. Виберіть XCode.
  • Натисніть на кнопку «Configure» до тих пір, поки не зникнуть всі червоні рядки. Натисніть на «Generate». Все, ваш проект XCode створений. Можете забути про CMake.
  • виберіть папку, шлях до якої Ви прописували у другому рядку. Знайдіть там файл Tutorials.xcodeproj. Відкрийте його.
  • Виберіть якийсь урок і запустіть його з допомогою кнопки Run


Замітка до Code::Blocks
У зв'язку з 2 багами (один Code::Blocks, один в CMake), Вам буде потрібно змінити налаштування програми Project->Build Options->Make commands наступним чином:


Також Вам доведеться налаштувати робочу директорію самостійно: Project -> Properties -> Build targets -> tutorial N -> Робоча папка.

Запуск уроків
Робочими директоріями всіх скомпільованих уроків повинні бути папки з виконуваними файлами.

Як слідувати уроків
Кожен урок містить вихідний код та інші файли, які можуть бути знайдені в tutorialXX/ директорії. Однак Ви не повинні змінювати ці проекти, вони поставляються тільки в якості прикладів. Для змін є файл playground/playground.cpp. Якщо щось піде не так в цьому файлі, просто скопіюйте код необхідного уроку.

Відкриття вікна
Ось ми і дісталися до OpenGL коду! Ну тобто не зовсім. Всі інші уроки показують низькорівневий шлях для виконання тих чи інших дій, для того, що б Ви бачили, що ніякої магії не відбувається. Але це нудно і марно, тому ми будемо використовувати сторонню бібліотеку GLFW для надання магії. Якщо Вам дуже хочеться — Ви можете використовувати Win32 API під Windows, X11 API під Linux і Cocoa API під Mac; ну або скористатися іншою високорівневої бібліотекою, начебто SFML, FreeGLUT, SDL і т. д.

Що ж, чому. На початку розберемося з залежностями: нам потрібно деякий базовий функціонал для виведення повідомлень в консоль:
// Підключення стандартних заголовків
#include < stdio.h>
#include <stdlib.h>

Далі підключаємо GLEW. Ця бібліотека надає трохи магії, але залишимо це на потім:
// Підключення GLEW. Завжди підключайте його перед gl.h і glfw.h
#include < GL/glew.h>

Ми вирішили, що будемо використовувати GLFW для роботи з вікном і клавіатурою, тому підключаємо і її:
// Підключення GLFW
#include < GL/glfw3.h>

Наступна бібліотека зараз нам не знадобиться, але вона надає функціонал для роботи з 3D математикою. Дуже скоро вона нам знадобиться. У GLM немає ніякої магії, якщо хочете — можете написати власну бібліотеку для роботи з 3D математикою. Директива «using namespace» потрібна для того, що б можна було писати просто «vec3» замість «glm::vec3»:
// Підключаємо GLM
#include <glm/glm.hpp>
using namespace glm;

Якщо Ви скопіювали вищевказаний код в playground і спробували його запустити — то компілятор Вам повідомить, що немає функції main. Що ж, давайте додамо її:
int main() {

Для початку ініціалізуємо GLFW:
// Ініціалізація GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
return -1;
}

Тепер ми можемо створити наше OpenGL вікно!
glfwWindowHint(GLFW_SAMPLES, 4); // 4х кратний antialiasing

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // Ми хочемо використовувати OpenGL 3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Для того, що б зробити MacOS щасливою; може не знадобитися
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Ми не хочемо старий OpenGL

// Відкрити вікно і створити його OpenGL контекст.
GLFWwindow* window; // У що постачається вихідному коді, ця глобальна змінна.
window = glfwCreateWindow( 1024, 768, "Tutorial 01", NULL, NULL);
if( window == NULL ){
fprintf( stderr, "Failed to open GLFW window. If you have an GPU Intel, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" );
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window); // Ініціалізуємо GLEW
glewExperimental=true; // Вимагається при налагодженні ядра
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}

Зберіть цей код і запустіть. Повинно з'явитися чорне вікно і відразу закритися. Ну звичайно! Нам потрібно почекати поки користувач не натисне Escape:

// Переконався, що ми можемо ловити натиснуті клавіші
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

do{
// Нічого не промальовуємо. Побачимося на 2 уроці!

// Оновлюємо буффер
glfwSwapBuffers(window);
glfwPollEvents();

} // Перевіряємо, чи була натиснута клавіша Esc або було закрито вікно?
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0 );

На цьому закінчується перший урок! На 2 уроці Ви навчитеся малювати трикутник.
Джерело: Хабрахабр

0 коментарів

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