Skip to content

Latest commit

 

History

History
83 lines (62 loc) · 5.6 KB

File metadata and controls

83 lines (62 loc) · 5.6 KB

Hello window

OpenGL

Об OpenGL обычно говорят, как о графическом API, но это не совсем так, сама OpenGL - это спецификация API, разработанная Khronos Group, а конкретная реализация предоставляется графическим драйвером. При этом OpenGL имеет кучу разных версий и расширений, которые могут поддерживаться драйвером устройства/видеокартой как таковой, поэтому все функции OpenGL загружаются динамически (подробнее). Это можно сделать вручную, но для удобствва и чтобы не изобретать велосипед, можно использовать готовую библиотеку-загрузчик. Мы будем использовать glad, хотя на самом деле это не так уж и важно для нас. Так же OpenGL тесно связан с оконной системой. Создание контекста OpenGL обычно происходит при создании окна, так что нам нужна библиотека, которая позволила бы создать окно с контекстом OpenGL. Обычно для этих целей используют SDL2 или glfw. Первая очень популярна, имеет огромное количество крутых функций и используется даже крупными игровыми студиями, однако на мой взгляд glfw будет более простым в освоении и прекрасно подходит для наших задач.

GLFW

GLFW - кросс-платформенная библиотека, которая предназначения для создания оконных приложений. Если быть точнее, то с помощью нее мы можем создать окно и контекст OpenGL, а так же обрабатывать ввод.

Написание кода

Инициализация

Перед использованием библиотеку нужно инициализировать, а после очистить все используемые ей ресурсы, для этого существуют функции glfwInit и glfwTerminate

#include <GLFW/glfw3.h> // GLFW

// Настройки окна
constexpr int         g_nWindowWidth  = 640;
constexpr int         g_nWindowHeight = 480;
constexpr const char *g_szWindowTitle = "OpenGL tutorial";

int main( int argc, const char *argv[] )
{
    if ( !glfwInit() ) // инициализируем библиотеку перед использыванием и проверяем успех
    {
        std::cerr << "Failed to init GLFW" << std::endl;
        return -1;
    }
    ... // Создаем окно
    glfwTerminate(); // деинициализируем
    return 0; // выходим
}

Создание окна

Далее нам нужно создать окно, для этого используется функция glfwCreateWindow, а в конце удалить его при помощи glfwDestroyWindow.

    GLFWwindow* pWindow = nullptr;
    pWindow = glfwCreateWindow( g_nWindowWidth, g_nWindowHeight, g_szWindowTitle, nullptr, nullptr ); // передаем ширину, высоту и заголовок окна, два последних параметра - monitor (используется для создания полноэкранного окна) и share ()
    if ( !pWindow ) // Проверяем, что окно было успешно создано, иначе выводим сообщение об ошибку, деинициализируем glfw и закрываем приложение
    {
        std::cerr << "Failed to create window" << std::endl;
        glfwTerminate();
        return -1;
    }
    ... // главный цикл будет здесь
    glfwDestroyWindoww(pWindow);

Главный цикл

Теперь главный цикл. Тут все просто - пока окно не должно закрыться (glfwWindowShouldClose), обрабатываем события, произошедшие с окном (glfwPollEvents), например, ввод с клавиатуры, движение мышью, закрытие окна или изменение его размера.

    while ( !glfwWindowShouldClose( pWindow ) ) // Пока pWindow не закрыто
    {
        glfwPollEvents(); // Обрабатываем события (event'ы)
    }

Итог

При запуске данного кода, если Вы все сделали правильно, у Вас должно появится окно 640 на 480 с заголовком OpenGL tutorial.

Исходный код - 01_hello_window

Далее - урок 2