Введение

Добро пожаловать на первый урок!

Перед тем как перейти непосредственно к 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 );

И это завершает наш первый урок! Во втором уроке мы узнаем как выводить простейший треугольник. Увидимся :)