2. diel - 3D grafika v OpenGL a C ++ - Vytvorenie okna
V predchádzajúcej lekcii, 3D grafika v OpenGL a C ++ - Úvod a inštalácia , sme si nainštalovali OpenGL a všetky potrebné moduly. Je na čase, aby sme už začali písať kód.
Pred samotným vykresľovaním sa musíme zoznámiť s dôležitou časťou OpenGL, a to s jeho vykreslovacím systémom.
Systém súradníc
Ak ste už niekedy predtým programovali s grafickými knižnicami, ako
napríklad s SDL (Simple DirectMedia Layer), tak ste určite zvyknutí
na používanie tzv. Svetového súradnicového systému (WCS). Tento
systém súradníc je orientovaný z ľavého horného rohu
(0
, 0
) smerom doprava dole
(max X
, max Y
). Na rovnakom princípe fungujú aj
obrazovky monitorov.
Ako príklad si môžeme uviesť okno s rozmermi 800 x 600 px:
Tento systém súradníc možno priamo využiť iba pre 2D grafiku, preto sa OpenGL veľmi nehodí. OpenGL vidí všetky objekty ako sadu vrcholov usporiadaných do trojuholníkových skupín v 3D priestore, ktoré následne prepočítava a vykresľuje. SDL súradnicový systém by bol pre výpočty veľmi mätúce. Z tohto dôvodu OpenGL využíva iný systém súradníc, ktorý si následne prevedie na WCS. Konverziu si OpenGL implementuje už podľa svojho.
Ako príklad si uveďme nasledujúce okno s WCS:
Tento systém súradníc je už oveľa lepšie. Ide o tzv. Normalizovaný
systém súradníc (NDC). Vykresľovací plocha je tu orientovaná
z ľavého dolného rohu (-1
, -1
) do
pravého horného rohu (1
, 1
) so
stredom v 0
, 0
. Takto môže OpenGL všetky body
jednoducho spočítať a následne je len prevedie na WCS.
OpenGL je 3D, čo znamená, že má aj tretí os (hĺbku),
ktorá sa označuje z
. V budúcej lekcii budeme vykresľovať len
2D trojuholník, takže sa jej nebudeme moc zaoberať. Je ale dobré vedieť,
že aj keď vykresľujú 2D, os z
je stále prítomná. Viď.
obrázok:
Otvorenie okna
Teraz už vieme, akým spôsobom OpenGL vykresľuje. Poďme si teda otvoriť naše prvé okno. Pred jeho otvorením ale musíme spustiť kľúčové moduly.
Hneď ako prvé si naincludujeme potrebné OpenGL súbory a zadefinujeme
funkciu main()
:
#include <GL/glew.h> #include <GLFW/glfw3.h> int main() { //[...] }
Ak naše IDE importy podčiarkne a bude ukazovať chybu, že nemohlo dané súbory nájsť, tak znova prejdite kroky v predchádzajúcej lekcii. Inak gratulujem, máte najjednoduchšia časť kurzu za sebou:) . Tiež treba dodať, že tieto súbory vždy includujte ako prvý a v tomto poradí, inak sa vám program nemusí skompilovať / spustiť správne.
Pozrime sa teraz do main()
, odkiaľ budeme spúšťať OpenGL
moduly. Ako prvý musíme spustiť GLFW, pretože nám sprostredkováva okrem
vstupov aj vytvorenie okna:
// pokud se nepodaří spustit GLFW, tak nepůjde spustit ani okno if (!glfwInit()) { return -1; }
Ak sa niekde počas inicializácie vyskytla chyba, musíme celý program termínovú. Inak sa môžeme presunúť k tzv. Window hintům, ktoré nám nastavujú vlastnosti nášho 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
Pri vytvorení nového okna GLFW použije všetky hint, ktoré sme mu nastavili. Medzi tieto vlastnosti patrí napr. Verzie OpenGL, vyhladzovania obrazu alebo pridanie kompatibility.
Po nastavení vlastností nášho okna si ho už môžeme vytvoriť. Okno si deklarujeme a povieme GLFW, aby ho vytvorilo:
// 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; }
Tu oknu nastavíme jeho rozmery a názov. Posledné dva parametre zvolí špecifický monitor a prípadné zdieľanie iného okna. Tie necháme na defaultných hodnotách.
Ako posledný krok pred vykresľovaním musíme spustiť samotnej OpenGL (respektíve jeho jadro). Na naše okno si pridáme vykresľovací kontext a následne inicializujeme Glewe:
// 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čne sme sa dostali k poslednej časti dnešného kódu. Toto je naša hlavná slučka, ktorá má za úlohu vykresľovať modely a vyhodnocovať 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;
Akonáhle naše okno zatvoríme, slučka sa preruší a program sa ukončí.
V aktuálnom stave nám slučka nerobí nič špeciálneho, len bude
vykresľovať čierne pozadie, kým okno nezatvoríme. Farbu pozadia nastavíme
v klasickom RGBA formáte, avšak hodnoty budú v rozsahu
0.0 - 1.0
.
Double buffering je proces, kedy sa celá scéna vykreslí do pomocnej pamäte a po dokončení vykresľovanie sa vymení s aktuálne vykresľovanie pamäťou na obrazovke. Tým sa docieli toho, že sa scéna vykreslí naraz (nie po častiach) a vyhneme sa tak nepríjemnému blikanie.
Ak teraz kód skompiluje a spustíte, tak vám pravdepodobne vyskočí chyba
kvôli absencii nejakej knižnice. Tento problém vyriešime pridaním knižnice
glew32.dll
do adresára, odkiaľ spúšťame náš
program (v našom prípade tam, kde sa nachádza .sln
nášho projektu, pretože ho spúšťame z IDE, inak by to bol adresár
.exe
súboru). Táto knižnica sa nachádza v priečinku
C:\...\knihovny\glew\bin\Release\x64
alebo Win32
.
Po pridaní potrebné knižnice by sa nám malo otvoriť naše okno:
Ak vám niečo nefungovalo, zdrojové kódy sú nižšie k stiahnutiu.
V ďalšej lekcii, 3D grafika v OpenGL a C ++ - Základy vykresľovanie , sa pozrieme na vykresľovací systém, ktorý nám OpenGL poskytuje a vykreslíme si náš prvý trojuholník.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 14x (1.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C++