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:
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:
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:
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:
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 14x (1.31 kB)
Aplikace je včetně zdrojových kódů v jazyce C++