Урок 1: Открываем окно
Введение
Добро пожаловать на первый урок!
Перед тем как перейти непосредственно к OpenGL вы узнаете как откомпилировать код, которым сопровождается каждый урок и как его запустить.
Навыки
Чтобы работать с данными уроками вам не потребуется дополнительных навыков. Опыт в любом языке программирования (C, Java, Lisp, JavaScript и других) поможет вам лучше понимать суть, но вовсе не обязателен.
Все уроки написаны на “легком” C++ и мы потратили много усилий, чтобы сделать код настолько простым, насколько это вообще возможно. Здесь не будет шаблонов, классов и указателей, что позволит вам понять все, даже если вы знаете только Java.
Забудьте все
Забудьте все, что вы знали об OpenGL ранее, если ваши знания касаются glBegin() и подобных функций. Здесь вы будете изучать новые стандарты OpenGL (OpenGL 3 и 4), в отличие от многих онлайн-уроков, в которых до сих пор рассматривается “старый” OpenGL (OpenGL 1 и 2).
Компиляция исходного кода уроков
Весь исходный код к урокам может быть скомпилирован на таких платформах, как Windows, Linux, Mac. Общая процедура для всех этих платформ будет приблизительно одинакова:
- Обновите драйверы! Обязательно сделайте это, если что мы вас предупреждали :)
- Скачайте компилятор, если у вас его до сих пор нет.
- Установите CMake
- Скачайте исходный код урока
- Создайте проект используя CMake
- Скомпилируйте проект
- Изменяйте его :)
Теперь рассмотрим процедуру подробнее для каждой платформы. Вполне возможно вам потребуется что-то адаптировать под ваши требования и возможности, для этого можете руководствоваться инструкцией для Windows.
##Компиляция в Windows
- Обновление драйверов должно быть для вас легкой задачей. Все что вам нужно - это просто сходить на сайт NVidia или AMD, скачать оттуда драйверы и установить их. Если вдруг вы не знаете точно модель вашей видеокарты, то вы можете посмотреть ее в свойствах адаптера, для этого перейдите в Панель управления -> Система -> Диспетчер устройств -> Видео адаптер. Если у вас встроенный Intel GPU, то драйверы всегда поставляются в комплекте.
- Мы предлагаем вам использовать Visual Studio 2015 Express for Desktop в качестве среды, которую вы можете бесплатно скачать здесь. Если же вы захотите использовать MinGW, то мы рекомендуем вам Qt Creator. В любом случае, устанавливайте то, что вам необходимо и хотя шаги в уроках рассматриваются в Visual Studio, скорее всего различия в других IDE будут минимальны.
- Скачайте CMake и установите его.
- Скачайте исходный код, распакуйте его к примеру в C:/Users/XYZ/Projects/OpenGLTutorials
- Запустите CMake. В первом поле укажите путь к распакованной папке. Если сомневаетесь, то это та папка, где находится файл CMakeLists.txt. Во втором поле укажите папку, в которую будут записываться исполняемые файлы, например вы можете указать здесь C:/Users/XYZ/Projects/OpenGLTutorials-build-Visual2010-32bits или что-то подобное. К слову, эта папка может находиться где угодно.
- Нажмите кнопку Configure. Так как вы впервые настраиваете проект CMake спросит вас, какой именно компилятор вы хотите использовать. Здесь все упирается в ваш инструментарий, который вы выбрали в шаге 2. Кстати, если у вас Windows 64-bit, то вы можете выбрать 64 разрядные компиляторы, но если вы не уверены, то используйте 32.
- Нажимайте Configure до тех пор, пока не исчезнут все красные строки. Далее нажмите Generate. Теперь ваш Visual Studio проект создан и вы можете забыть про CMake. Можете даже удалить его, если хотите :)
- Откройте в Visual Studio файл Tutorials.sln в папке, которую вы указывали во втором поле главного окна CMake (C:/Users/XYZ/Projects/OpenGLTutorials-build-Visual2010-32bits). В меню Build нажмите Build All. Исходный код каждого урока и зависимостей будет откомпилирован. Также, каждый исполняемый файл будет скопирован обратно в C:/Users/XYZ/Projects/OpenGLTutorials . Надеемся у вас не возникнет ошибок.
- Откройте C:/Users/XYZ/Projects/OpenGLTutorials/playground и запустите playground.exe. Если все прошло гладко, то у вас должно появиться черное окно.
Вы также можете запустить любой урок из Visual Studio. Для этого нажмите правой кнопкой мыши на Playground и выберете “Choose as startup project”. Для отладки используйте клавишу F5.
##Компиляция в Linux
Существует большое количество разных дистрибутивов Linux и естественно рассмотреть особенности каждого дистрибутива выходит за рамки данного урока, поэтому не забудьте почитать документацию своего дистрибутива.
- Установите последние драйверы. Мы настоятельно рекомендуем вам использовать закрытые драйверу. Это не GNU, но они работают. Если ваш дистрибутив не предоставляет автоматической установки, можете попробовать посмотреть в документации к Ubuntu
-
Установите все необходимые компиляторы, утилиты и библиотеки. Полный список выглядит так:
- cmake
- make
- g++
- libx11-dev
- libxi-dev
- libgl1-mesa-dev
- libglu1-mesa-dev
- libxrandr-dev
- libext-dev
Используйте sudo apt-get install *** или su && yum install ****.
- Скачайте исходный код и распакуйте его, к примеру в ~/Projects/OpenGLTutorials/
-
Перейдите в ~/Projects/OpenGLTutorials/ и введите следующие команды:
- mkdir build
- cd build
-
cmake ..
- makefile будет создан в директории build
- Выполните команду make all . Весь исходный код к урокам будет скомпилирован, а каждый исполняемый файл будет также скопирован в ~/Projects/OpenGLTutorials/. Надеемся у вас не возникнет ошибок :)
- Откройте ~/Projects/OpenGLTutorials/playground и выполните ./playground. Если все прошло гладко, то у вас должно появиться черное окно.
Обратите внимание, что лучшим решением будет использовать IDE, такую как Qt Creator. Она имеет поддержку CMake и предоставляет удобные инструменты для отладки. Инструкция для QtCreator:
- В QtCreator перейдите в меню File -> Tools -> Options -> Compile&Execute -> CMake
- Установите путь к CMake. Чаще всего это /usr/bin/cmake
- File -> Open Project и выберите tutorials/CMakeLists.txt
- Выберите директорию, в которую необходимо помещать скомпилированные файлы. Лучше всего выбрать директорию вне tutorials
- Опционально установите -DCMAKE_BUILD_TYPE=Debug в Parameters и используйте Validate.
- Нажмите на иконку молота внизу. Теперь уроки могут быть запущены из директории tutorials/
- Чтобы запускать уроки непосредственно из QtCreator, перейдите в Projects -> Execution parameters -> Working Directory и выберете директорию, в которой находятся шейдеры, текстуры и модели. К примеру для Урока 2 это будет: ~/opengl-tutorial/tutorial02_red_triangle/
##Компиляция в Mac
Mac OS не поддерживает OpenGL 3.3. Последние Маки с MacOS 10.7 Lion и совместимыми GPU могут работать с OpenGL 3.2, но не с 3.3. Поэтому используйте исходный код уроков для 2.1. В остальном процедура компиляции очень похожа на процедуру в Windows (Makefile также поддерживаются, но не будут рассматриваться):
- Установите XCode из Mac App Store
- Скачайте CMake и установите .dmg . Нет необходимости устанавливать утилиты командной строки.
- Скачайте исходный код (обязательно версия 2.1) и распакуйте его к примеру в ~/Projects/OpenGLTutorials/ .
- Запустите CMake (Applications -> CMake). В первом поле ввода укажите путь к папке с распакованным исходным кодом уроков. Если сомневаетесь, то это папка, содержащая файл CMakeLists.txt. Во втором поле укажите где вы хотите сохранить исполняемые файлы. К примеру это может быть ~/Projects/OpenGLTutorials_bin_XCode/. Обратите внимание, эта папка может находиться где угодно.
- Нажмите на кнопку Configure. Так как вы используете конфигурацию впервые, то CMake спросит у вас какой компилятор вы хотите использовать. Выберете XCode.
- Нажимайте Configure до тех пор, пока не исчезнут все красные строки. Нажмите Generate. Теперь проектный файл для XCode создан и вы можете забыть о CMake, и даже можете удалить его, если захотите.
- Откройте ~/Projects/OpenGLTutorials_bin_XCode/ . Найдите и откройте файл Tutorials.xcodeproj
- Выберете урок, который хотите запустить в XCode Scheme Panel и нажмите кнопку Run для компиляции и запуска
##Внимание для пользователей Code::Blocks
Из-за 2 багов (один в C::B, один в CMake), вам необходимо изменить командную строку Project -> Build Options -> Make commands, как указано на скриншоте:
Вам также необходимо установить рабочую директорию: Project -> Properties -> Build targets -> tutorial N -> рабочая директория исполняемых файлов (это src_dir/tutorial_N)
Запуск уроков
Чтобы запустить исполняемый файл урока просто выполните двойной щелчок мышью на файле в нужной директории. Если вы предпочитаете командную строку, то не забудьте использовать команду cd, чтобы перейти в нужную директорию.
Если вы хотите запустить урок из IDE, То не забудьте прочитать инструкции, данные выше, чтобы установить корректную рабочую директорию.
Как работать с уроками
К каждому уроку прилагается исходный код и все необходимые файлы данных, которые могут быть найдены в tutorialXX/. Тем не менее вы вряд ли будете изменять эти проекты, так как они даются для справки. Лучшим решением будет открыть playground/playground.cpp и изменять его так, как вам захочется. Если по каким-то причинам у вас его нет, то просто скопируйте код любого урока туда и все.
Мы предоставляем фрагменты кода в каждом уроке. Не стесняйтесь копировать эти фрагменты в playground, пока читаете и экспериментировать с ними - это хорошая практика, гораздо лучшая, чем просто читать готовый код или просто копировать его.
Открываем окно
Наконец! Настало время кода 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 <GLFW/glfw3.h>
Следующий заголовок не является необходимым в данный момент, так как является библиотекой трехмерной математики, но позже будет очень полезен. В нем нет никакой магии и если вы знаете математику, то вполне можете написать свой аналог. Что касается “using namespace glm”, то эта строка переводит пространство имен в glm, чтобы можно было писать “vec3”, вместо “glm::vec3”.
// Включаем GLM
#include <glm/glm.hpp>
using namespace glm;
Если вы скопировали код представленный выше в playground.cpp, то компилятор предупредит вас, что нет функции main(), поэтому добавим ее:
int main(){
В теле функции первым делом инициализируем GLFW:
// Инициализируем GLFW
if( !glfwInit() )
{
fprintf( stderr, "Ошибка при инициализации GLFWn" );
return -1;
}
Теперь мы можем создать наше первое OpenGL окно! :)
glfwWindowHint(GLFW_FSAA_SAMPLES, 4); // 4x Сглаживание
glfwWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // Мы хотим использовать OpenGL 3.3
glfwWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
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, "Невозможно открыть окно GLFW. Если у вас Intel GPU, то он не поддерживает версию 3.3. Попробуйте версию уроков для OpenGL 2.1.n" );
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// Инициализируем GLEW
glewExperimental=true; // Флаг необходим в Core-режиме OpenGL
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Невозможно инициализировать GLEWn");
return -1;
}
Скомпилируйте и запустите этот исходный код. Если все сделано правильно, то у вас откроется и тут же закроется окно с контекстом OpenGL и это правильно, так как мы не указали, что хотим ждать до тех пор, пока пользователь не нажмет клавишу Escape. Самое время сделать это:
// Включим режим отслеживания нажатия клавиш, для проверки ниже
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
do{
// Пока что ничего не выводим. Это будет в уроке 2.
// Сбрасываем буферы
glfwSwapBuffers(window);
glfwPollEvents();
} // Проверяем нажатие клавиши Escape или закрытие окна
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0 );
И это завершает наш первый урок! Во втором уроке мы узнаем как выводить простейший треугольник. Увидимся :)