IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 2 - 3D grafika v OpenGL a C++ - Vytvoření okna

V předchozí lekci, 3D grafika v OpenGL a C++ - Úvod a instalace, jsme si nainstalovali OpenGL a všechny potřebné moduly. Je na čase, abychom už začali psát kód.

Před samotným vykreslováním se musíme seznámit s důležitou částí OpenGL, a to s jeho vykreslovacím systémem.

Souřadnicový systém

Pokud jste již někdy dříve programovali s grafickými knihovnami, jako například s SDL (Simple DirectMedia Layer), tak jste určitě zvyklí na používání tzv. světového souřadnicového systému (WCS). Tento souřadnicový systém je orientován z levého horního rohu (0, 0) směrem doprava dolů (max X, max Y). Na stejném principu fungují i obrazovky monitorů.

Jako příklad si můžeme uvést okno s rozměry 800x600 px:

Souřadnicový systém SDL - OpenGL - 3D grafika v C++

Tento souřadnicový systém lze přímo využít pouze pro 2D grafiku, proto se OpenGL moc nehodí. OpenGL vidí všechny objekty jako sadu vrcholů uspořádaných do trojúhelníkových skupin ve 3D prostoru, které následně přepočítává a vykresluje. SDL souřadnicový systém by byl pro výpočty velice matoucí. Z tohoto důvodu OpenGL využívá jiný souřadnicový systém, který si následně převede na WCS. Konverzi si OpenGL implementuje již podle svého.

Jako příklad si uveďme následující okno s WCS:

Souřadnicový systém OpenGL - OpenGL - 3D grafika v C++

Tento souřadnicový systém je již mnohem lepší. Jedná se o tzv. normalizovaný souřadnicový systém (NDC). Vykreslovací plocha je zde orientována z levého dolního rohu (-1, -1) do pravého horního rohu (1, 1) se středem v 0, 0. Takto může OpenGL všechny body jednoduše spočítat a následně je jen převede na WCS.

OpenGL je 3D, což znamená, že má i třetí osu (hloubku), která se označuje z. V příští lekci budeme vykreslovat pouze 2D trojúhelník, takže se jí nebudeme moc zabývat. Je ale dobré vědět, že i když vykreslujeme 2D, osa z je stále přítomna. Viz. obrázek:

3D souřadnice v OpenGL - OpenGL - 3D grafika v C++

Otevření okna

Nyní už víme, jakým způsobem OpenGL vykresluje. Pojďme si tedy otevřít naše první okno. Před jeho otevřením ale musíme spustit klíčové moduly.

Hned jako první si naincludujeme potřebné OpenGL soubory a nadefinujeme funkci main():

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

int main()
{
//[...]
}

Pokud naše IDE importy podtrhne a bude ukazovat chybu, že nemohlo dané soubory najít, tak znova projděte kroky v předchozí lekci. Jinak gratuluji, máte nejjednodušší část kurzu za sebou :). Také nutno dodat, že tyto soubory vždy includujte jako první a v tomto pořadí, jinak se vám program nemusí zkompilovat/spustit správně.

Podívejme se nyní do main(), odkud budeme spouštět OpenGL moduly. Jako první musíme spustit GLFW, protože nám zprostředkovává kromě vstupů i vytvoření okna:

// pokud se nepodaří spustit GLFW, tak nepůjde spustit ani okno
if (!glfwInit())
{
    return -1;
}

Pokud se někde během inicializace vyskytla chyba, musíme celý program terminovat. Jinak se můžeme přesunout k tzv. window hintům, které nám nastavují vlastnosti našeho okna:

glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing (vyhlazování; není nutné)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // chceme OpenGL verzi 4.6
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // aby naše aplikace běžela na MacOS, tenhle příkaz není jinak důležitý
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // vynutíme si novou verzi OpenGL

Při vytvoření nového okna GLFW použije všechny hinty, které jsme mu nastavili. Mezi tyto vlastnosti patří např. verze OpenGL, vyhlazování obrazu nebo přidání kompatibility.

Po nastavení vlastností našeho okna si ho již můžeme vytvořit. Okno si deklarujeme a řekneme GLFW, aby ho vytvořilo:

// vytvoření okna
GLFWwindow* okno;
okno = glfwCreateWindow(640, 320, "Prvni OpenGL okno", NULL, NULL);

// pokud se okno nevytvoří, nemá cenu nechat program běžet
if (!okno)
{
    glfwTerminate();
    return -1;
}

Zde oknu nastavíme jeho rozměry a název. Poslední dva parametry zvolí specifický monitor a případné sdílení jiného okna. Ty necháme na defaultních hodnotách.

Jako poslední krok před vykreslováním musíme spustit samotné OpenGL (respektive jeho jádro). Na naše okno si přidáme vykreslovací kontext a následně inicializujeme GLEW:

// spuštění GLEW na našem okně, umožní nám vykreslovat
glfwMakeContextCurrent(okno);
glewExperimental = true; // potřebujeme pro profilování
if (glewInit() != GLEW_OK)
{
    glfwTerminate();
    return -1;
}

Konečně jsme se dostali k poslední části dnešního kódu. Toto je naše hlavní smyčka, která má za úkol vykreslovat modely a vyhodnocovat logiku:

while (!glfwWindowShouldClose(okno))
{
    glClearColor(0.0, 0.0, 0.0, 1.0); // nastavení barvy pozadí (ve tvaru RGBA v rozmezí 0.0 - 1.0)
    glClear(GL_COLOR_BUFFER_BIT); // vyčištění okna
    //[...] vykreslování
    glfwSwapBuffers(okno); // OpenGL podporuje tzv. double buffering, proto vymění buffery
    glfwPollEvents(); // získání všech eventů (stisk klávesy atd.)
}

glfwTerminate();
return 0;

Jakmile naše okno zavřeme, smyčka se přeruší a program se ukončí. V aktuálním stavu nám smyčka nedělá nic speciálního, pouze bude vykreslovat černé pozadí, dokud okno nezavřeme. Barvu pozadí nastavíme v klasickém RGBA formátu, avšak hodnoty budou v rozsahu 0.0 - 1.0.

Double buffering je proces, kdy se celá scéna vykreslí do pomocné paměti a po dokončení vykreslování se vymění s aktuálně vykreslovanou pamětí na obrazovce. Tím se docílí toho, že se scéna vykreslí najednou (nikoliv po částech) a vyhneme se tak nepříjemnému blikání.

Pokud nyní kód zkompilujete a spustíte, tak vám nejspíše vyskočí chyba kvůli absenci nějaké knihovny. Tento problém vyřešíme přidáním knihovny glew32.dll do adresáře, odkud spouštíme náš program (v našem případě tam, kde se nachází .sln našeho projektu, protože ho spouštíme z IDE, jinak by to byl adresář .exe souboru). Tato knihovna se nachází ve složce C:\...\knihovny\glew\bin\Release\x64 nebo Win32.

Po přidání potřebné knihovny by se nám mělo otevřít naše okno:

První OpenGL okno - OpenGL - 3D grafika v C++

Pokud vám něco nefungovalo, zdrojové kódy jsou níže ke stažení.

V další lekci, 3D grafika v OpenGL a C++ - Základy vykreslování, se podíváme na vykreslovací systém, který nám OpenGL poskytuje a vykreslíme si náš první trojúhelník.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 11x (1.31 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

Předchozí článek
3D grafika v OpenGL a C++ - Úvod a instalace
Všechny články v sekci
OpenGL - 3D grafika v C++
Přeskočit článek
(nedoporučujeme)
3D grafika v OpenGL a C++ - Základy vykreslování
Článek pro vás napsal Richard Bleier
Avatar
Uživatelské hodnocení:
4 hlasů
Aktivity