Számítógépes Grafika OpenGL és SDL alapok

Slides:



Advertisements
Hasonló előadás
OpenGL 2. gyakorlat Hapák József
Advertisements

2010/2011 ősz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál  Részei.
Operációs Rendszerek I.
Operációs rendszerek Bevezetés.
Számítógépes ismeretek 5. óra
Kifejezések 2+3 Egy egyszerű kifejezés… © Pasztuhov Dániel, www.programozas-oktatas.hu.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
8. előadás (2005. április 19.) Pozicionálás fájlban (folyt.) I/O mechanizmus váltás Hibakezelő függvények Változók tárolási osztályai Parancssor-argumentumok.
GPGPU labor I. OpenGL, Cg.
Készítsünk el egy olyan egy dokumentumos (SDI) alkalmazást, amely alkalmas a mysql adatbáziskezelővel létrehozott BANK adatbázisunk UGYFEL táblájának.
Dinamikus tömbök.
Bevezetés a Java programozásba
Bevezetés a Java programozásba
10. előadás (2004. április 20.) A C előfordító (folytatás) Néhány hasznos compiler opció Egy tanulságos könyvtári függvény Változó hosszúságú argumentum.
11. előadás (2005. május 10.) A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások 1.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Követelmények Bevezetés a Javába Első java program írása Dokumentációk
A CLIPS keretrendszer CLIPS "C" Language Integration Production System.
Mutatók, tömbök, függvények
Grafika a programban Készítette: Pető László. Bevezetés Valójában nem a célobjektumra rajzolunk, hanem annak festővászon területére (canvas). Csak olyan.
Ember László Damn Small Linux Microsoft VPC környezetben.
WEB Technológiák Dr. Pance Miklós – Kolcza Gábor Miskolci Egyetem.
Számítógépes grafika OpenGL 1. gyakorlat.
Webszerkesztés Stíluslapok (CSS).
1 Operációs rendszerek Az NT folyamatok kezelése.
Számítógépes grafika 3. gyakorlat.
Turbo Pascal 11..
1.4. Fordítás, szerkesztés, az objektumkönyvtár használata.
Készítette: Csíki Gyula
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Visual Basic 2008 Express Edition
OpenGL 4 shaderek, GLSL Valasek Gábor
Fontos információk.
Objektum orientált programozás 3. Függvények Nagy Szilvia.
Objektum orientált programozás
Apache Ant 2. gyakorlat Alkalmazásfejlesztés /2 Gyakorlat Zalatnai Csongor.
RAD Studio XE5: menük felépítése
Számítógépes grafika gyakorlat DirectX segítség A következő dolgokra van szükség: CG Toolkit: 
CUDA C/C++ programozás Atomikus műveletek A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Számítógépes grafika I. AUTOCAD alapok
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
Számítógépes grafika I. AUTOCAD alapok 3. előadás.
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
BIOLÓGUS INFORMATIKA 2008 – 2009 (1. évfolyam/1.félév) 3. Előadás.
Számítógépes grafika OpenGL 5. gyakorlat.
DLL használata és készítése Feladat
Számítógépes Grafika OpenGL 4 shaderek, GLSL. OpenGL 4 A következő programozható fázisok vannak a 4.x-es OpenGL-ben: Vertex shader Tesselation control.
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
Struktúrák a C nyelvben 1 Akkor használjuk, ha az egy egyedre jellemző különböző típusú adatokat együtt akarjuk tárolni. Lényegében típusdeklaráció. A.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Grafikus szoftver Szirmay-Kalos László. Interaktív programok felépítése input csővezeték output csővezeték.
A Mozilla magyar nyelvű szerkesztőjének használata
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Könyvtárstruktúra, felhasználói és rendszerkönyvtárak Fájlkiterjesztések, attribútumok és engedélyek Takács Béla 2016.
Készítette: Rummel Szabolcs Elérhet ő ség: Linux kezelése.
Neumann János Informatikai Kar
Alkalmazásfejlesztés gyakorlat
a programegységek között
Neumann János Informatikai Kar
Neumann János Informatikai Kar
A CLIPS keretrendszer
Ubuntu – ismerkedés Fájlok és könyvtárak
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Előadás másolata:

Számítógépes Grafika OpenGL és SDL alapok

Órai programok A félév során vett programok elérhetőek a http://cg.elte.hu/~msc_cg oldalról Mindegyik Visual Studio-s program alapbeállítás szerint a T:\ meghajtó gyökerében keresi az OGLPack-ot Ez egy egyszerű zip fájl, ami minden, OpenGL-es program futtatásához szükséges library-t tartalmaz Innen érhető el: http://cg.elte.hu/~bsc_cg/resources/

OGLPack Tartalmazza a következőket használó programok Windows alatti fordításához és futtatásához szükséges fájlokat: Glew: http://glew.sourceforge.net/ GLM: http://glm.g-truc.net/ SDL: https://www.libsdl.org/ SDL Image: https://www.libsdl.org/projects/SDL_image/

OGLPack Az óra kódok használatához már csak egy T:\ meghajtóra van szükség, aminek a gyökerében az OGLPack könyvtár van: subst t: .

Első SDL-es program

SDL Az SDL (Simple DirectMedia Layer - http://www.libsdl.org/ ) könyvtár egy crossplatform multimédiás könyvtár ami alacsony szintű hozzáférést ad Audio Bemeneti (egér, billentyűzet, joystick) Grafikus (OpenGL-en keresztül GPU-hoz pl.) eszközökhöz

SDL Mi alap ablakozási dolgokra fogjuk használni (ablakok létrehozása, események kezelése) Illetve magát az OpenGL context-et is rajta keresztül hozzuk létre ...elfedve, hogy pontosan hogyan is kell ezt Windows alatt ...vagy Linux/OSX/akármi alatt

SDL Több almodulból áll Az SDL inicializálásakor meg kell adni, hogy milyen almodulokat akarunk még használni Mi általában csak SDL_Init( SDL_INIT_VIDEO ); hívást használunk

SDL erőforrások Az SDL-ben az erőforrásokat üres struktúrákra mutató pointerekkel azonosítják Tehát SDL_Window* egy ablakot azonosít De maga az SDL_Window struct így néz ki: typedef struct SDL_Window SDL_Window; Továbbiakban nyugodtan gondoljatok ezekre úgy, mint sima egész számokra Ha egy erőforrás attribútumait kell lekérdezni, akkor arra külön függvényeket kell hívni

SDL rajzolás A rajzoláshoz szükséges erőforrásokat és állapotváltozókat egy úgynevezett Renderer kezeli A Renderer létrehozásához egy rajzterületre, ablakra van szükség A rajzolás állapot alapú A tényleges rajzparancsok eredménye az állapotváltozók aktuális értékeitől függenek Állapotváltozó például a rajzolási szín, a vonalvastagság stb.

SDL A gyakorlatokon az SDL 2.0-át fogjuk használni A programhoz linkelendő lib-ek: SDL2.lib SDL2main.lib A használatához szükséges header: #include <SDL.h>

SDL A fordításhoz szükséges lib-eket meg kell adni a Visual Studio-nak Erre két lehetőség van Kódból Project properties-ben

SDL libek megadása kódból A következőket írjuk be az #include-ok után #pragma comment(lib, "SDL2.lib") #pragma comment(lib, "SDL2main.lib")

SDL libek megadása properties-ben

SDL futtathatók beállítása A programunknak szükséges lesz arra, hogy lássa az SDL-es függvények implementációit Ezek különböző DLL fájlokban vannak A DLL-ek a OGLPack\bin mappán belül: \x86: 32 bites DLL-ek \x64: 64 bites DLL-ek A szükséges DLL-eket olyan helyre kell másolni, ahol a rendszer látja (PATH környezeti változó) Vagy amit már csináltunk:

SDL futtathatók beállítása

01_HelloSDL A program letölthető innen: http://cg.elte.hu/~bsc_cg/gyak/01/01_HelloSDL.zi p A program a következőket csinálja: Inicializálja az SDL-t Létrehoz egy ablakot Létrehoz egy Renderer-t, rajzolót, amit ablakhoz rendel Rajzol Megszünteti a Renderer-t Megszünteti az ablakot és leállítja az SDL-t

01_HelloSDL/main.cpp #include <SDL.h> #include <iostream> void exitProgram() { std::cout << "Kilépéshez nyomj meg egy billentyűt..." << std::endl; std::cin.get(); } int main( int argc, char* args[] ) atexit( exitProgram ); ...

01_HelloSDL/main.cpp Az atexit() parancs a paraméterben kapott függvénypointer által mutatott függvényt hívja meg az alkalmazás terminálásakor Ez a függvény most az exitProgram, amit csak arra használunk, hogy a konzolablak eltűnése előtt megvárjunk egy billentyűleütést

01_HelloSDL/main.cpp // 1. lépés: inicializáljuk az SDL-t if ( SDL_Init( SDL_INIT_VIDEO ) == -1 ) { std::cout << "[SDL indítása]Hiba az SDL inicializálása közben: " << SDL_GetError() << std::endl; return 1; } // 2. lépés: hozzuk létre az ablakot, amire rajzolni fogunk SDL_Window *win = 0; win = SDL_CreateWindow( "Hello SDL!", 100, 100, 640,480,SDL_WINDOW_SHOWN); if (win == 0){ std::cout << "[Ablak létrehozás]Hiba az SDL inicializálása közben: " << SDL_GetError() << std::endl; return 1; }

SDL_INIT int SDL_Init(Uint32 flags): Inicializálja a paraméterben kapott SDL alrendszereket Ha többet akarunk, akkor bináris VAGY művelettel kapcsoljuk össze őket Alrendszerek:

SDL_Window A következőképpen van deklarálva: typedef struct SDL_Window SDL_Window; Egy SDL-es ablak-azonosító Az ablak attribútumait ne a pointeren keresztül próbáld lekérni vagy módosítani! Erre külön függvények vannak (például SDL_SetWindowTitle és társai)

SDL_CreateWindow SDL_CreateWindow: Létrehoz egy w széles, h magas ablakot a title fejléccel, az (x,y) képernyőkoordinátákon, flags megjelenítési attribútumokkal és siker esetén visszaadja az azonosítóját (különben NULL)

SDL_WindowFlags Megjelenítési tulajdonságok, szintén binárisan VAGY-olandóak

01_HelloSDL/main.cpp // 3. lépés: hozzunk létre egy renderelőt, rajzolót SDL_Renderer *ren = 0; ren = SDL_CreateRenderer( win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == 0) { std::cout << "[Renderer létrehozása]Hiba az SDL inicializálása közben: " << SDL_GetError() << std::endl; return 1; }

SDL_CreateRenderer SDL_CreateRenderer: 2D-s renderer context létrehozására használandó Azaz lényegében lehetővé teszi, hogy tudjunk rajzolni az ablakunkra Ha sikertelen a renderelő létrehozása, akkor NULL pointerrel tér vissza

SDL_CreateRenderer SDL_Renderer* SDL_CreateRenderer( SDL_Window* window, int index, Uint32 flags) Az ablak azonosítója, amire rajzolni szeretnénk a létrehozandó renderer segítségével

SDL_CreateRenderer SDL_Renderer* SDL_CreateRenderer( SDL_Window* window, int index, Uint32 flags) A renderer indexe, vagy -1, ha a kért képességeket (hardveresen gyorsított rajzolás stb., lásd flags) támogató első megfelel a céljainknak

SDL_CreateRenderer SDL_Renderer* SDL_CreateRenderer( SDL_Window* window, int index, Uint32 flags) Mi hardveresen gyorsítottat szeretnénk, a többi:

01_HelloSDL/main.cpp // 4. lépés: töröljük az ablak háttérszínét SDL_SetRenderDrawColor(ren, 0, 0, 0, 255); SDL_RenderClear(ren); // rajzoljunk egy vonalat más színnel (10,10)-ből (10,60)-ba SDL_SetRenderDrawColor(ren, 0, 255, 0, 255); SDL_RenderDrawLine( ren, 10, 10, 10, 60); // jelenítsük meg a backbuffer tartalmát SDL_RenderPresent(ren); // várjunk 2 másodpercet SDL_Delay(2000);

SDL_SetRenderDrawColor SDL_SetRenderDrawColor( SDL_Renderer* renderer, Uint8 r, Uint 8 g, Uint8 b, Uint8 a): Beállítja a renderer színét az (r,g,b) színre, a átlátszósággal Minden egyes színkomponens és az átlátszóság erőssége 0-255 közötti egész szám

SDL_RenderClear int SDL_RenderClear( SDL_Renderer* renderer): Sikertelen törlés esetén negatív számmal tér vissza Az aktuális rajzolási színnel „törli” az ablak rajzterületét

SDL_RenderDrawLine int SDL_RenderDrawLine( SDL_Renderer* renderer, int x1, int y1, int x2, int y2): Ez is, mint a többi SDL rajzoló utasítás, negatív számmal tér vissza, ha sikertelen (ilyenkor a SDL_GetError()-ral kideríthető a hiba oka) Egyébként a renderer-rel (az ő ablakára) rajzol egy egyenes szakaszt, ami az (x1,y1) és (x2,y2) pontokat köti össze

SDL_RenderPresent void SDL_RenderPresent( SDL_Renderer* renderer): Eddig minden rajzolást egy képernyőn kívüli memóriaterületre végeztünk Ezzel az utasítással jelezzük, hogy végeztünk a aktuális képkocka, frame kirajzolásával és most már ezt kell megjeleníteni

SDL_Delay void SDL_Delay(Uint32 ms): A paraméterben megadott milliszekundomot várakozik a program futása

01_HelloSDL/main.cpp SDL_DestroyRenderer( ren ); SDL_DestroyWindow( win ); SDL_Quit(); return 0; }

OpenGL

OpenGL Kiforrott szabvány: 1992 óta van Rengeteg elavult dolgot görgetett maga előtt OpenGL 3.0-nál ezeket megpróbáltál kidobni és újrarendezni az API-t Több-kevesebb sikerrel: Van egy úgynevezett Core profile, ami csak a modern OpenGL utasításait engedi használni De a régi kódok futtathatóságáért létezik egy Compatibility profile is, amiben minden függvény él, ami valaha OpenGL-es volt

OpenGL A félév során Core profile-lal fogunk foglalkozni Általában sokkal kisebb az overhead az utasítások végrehajtásánál Cserébe a Core-ból kirakott utasítások csendben elhalnak (=hibajelzés nélkül nem csinálnak semmit)

OpenGL Aktuális verzió: https://www.opengl.org/documentation/current_ver sion/ Nagyon hasznos olvasmány: https://www.opengl.org/registry/doc/glspec45.core. pdf és https://www.opengl.org/registry/doc/GLSLangSpec .4.50.pdf Vigyázzatok: ez specifikációs, nem pedig implementációs dokumentáció

OpenGL pipeline Részletes pipeline map: http://www.g- truc.net/doc/OpenGL%204.4%20Pipeline%20Map .pdf

OpenGL pipeline (gyengébb idegzetűeknek)

OpenGL működése Általában egy ablakba szeretnénk rajzolni A rajzolás egy OpenGL context-en keresztül történik, amihez hozzárendeljük az ablak megfelelő rajzterületét A kiadott OpenGL utasítások mindig az aktuális context-ben hajtódnak végre A rajzolás egy fix és programozható fázisokat is tartalmazó pipeline-on keresztül történik

OpenGL működése Az inkrementális képszintézis egyes lépéseinek pontos mikéntjeit programozható fázisok (shaderek) segítségével határozhatjuk meg Vannak cross-API kezdeményezések is shader- nyelvekre (NV CG) De mi az OpenGL natív magas szintű programnyelvét használjuk, a GLSL-t

Context Az aktuális OpenGL példány összes állapotát (állapotváltozóját) tárolja „Állapot(változó)” például egy tároló is, amiben pl. a kirajzoláshoz szükséges adatokat (VBO) vagy akár programot (shadert) tárolunk Egy (akár) képernyőre is kikerülő framebuffert is reprezentál (default framebuffer) Ha nincs explicit más FBO kötve, akkor minden rajzolási parancs eredménye ide megy OpenGL rajzolási parancs mindig az éppen aktív Context-en megy keresztül (erről később)

Adattípusok A C++-szal ellentétben az OpenGL pontosan megmondja, hogy hány biten és milyen reprezentációban várja a különböző számtípusokat Ezért van annyi GL* kezdetű típusnév typedef Figyeljünk ezekre

Adattípusok

Adattípusok

Erőforrások Az OpenGL az erőforrások azonosítására előjel nélküli egész számokat használ (Gluint) Létrehozásukra általában glGen* kezdetű utasítások szolgálnak Ezek visszaadnak (nem feltétlen return-nel) egy erőforrásazonosítót, ami a context névterébe kerül Alapból minden context-nek saját névtere van – de van lehetőség context-ek névtereit összekapcsolni (context sharing)

Erőforrások A nulla erőforrásazonosító mindig egy alapértelmezett értékre hivatkozik – ilyet erőforrás-létrehozó parancs nem adhat vissza (ha minden rendben van) Erőforrás-típusonként az azonosítók így 1-ről indulnak Kivéve, ha már létezett a névterünkben azonosító ebből a típusból; erről majd később a context sharing-nél

Erőforrás létrehozása Név generálása („deklaráció”) Név aktívvá tétele (bind-olás) Erőforrás-műveletek elvégzése („definíció”) Névhez rendelt erőforrás deaktiválása (=a 0-s erőforrásazonosító aktívvá tétele)

Erőforrások kezelése Az erőforráskezelő eljárások is állapot-alapon működnek Azaz a kiadott parancs mindig a parancs által módosított típus éppen aktív példányára hat Vagyis azt módosítja, ami éppen bind-olva van Röviden, amikor egy már létező erőforrást módosítunk: Bind Művelet Unbind = bind(0)