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í.

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:

Súradnicový systém SDL - OpenGL - 3D grafika v C ++

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:

Súradnicový systém OpenGL - OpenGL - 3D grafika v C ++

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:

3D súradnice v OpenGL - OpenGL - 3D grafika v C ++

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:

Prvý OpenGL okno - OpenGL - 3D grafika v C ++

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é 11x (1.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C++

 

Predchádzajúci článok
3D grafika v OpenGL a C ++ - Úvod a inštalácia
Všetky články v sekcii
OpenGL - 3D grafika v C ++
Preskočiť článok
(neodporúčame)
3D grafika v OpenGL a C ++ - Základy vykresľovanie
Článok pre vás napísal Richard Bleier
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity