Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./0. 3D grafika programozása OpenGL támogatással A 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./1. A kép létrehozásának elemei Tárgy(ak) Fényforrás(ok) Kamera A tárgyak fényvisszaverési tulajdonságai meghatározzák, hogyan lép velük interakcióba a fényforrás fénye. A tárgyak, a fényforrás és a kamera független egymástól. Forrás: Programming with OpenGL Part 0: 3D API http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./2. A kép létrehozásának elemei.. A leképezés geometriája - Camera Obscura Egy pont képének adatai egyszerű aránypárokkal adódnak: x p = -x/z*d y p = -y/z*d z p = d Forrás: Programming with OpenGL Part 0: 3D API http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./3. A kép létrehozásának elemei.. Középpontos vetítés Forrás: Programming with OpenGL Part 0: 3D API http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./4. A kép létrehozásának elemei.. Előnyök A tárgyak, a kamera és a fényforrások elkülönítése A két dimenziós grafika a három dimenziós grafika speciális esete Egyszerű programozási interfész szoftvert eredményez: - Tárgyak, fényforrások, kamera, jellemzők specifikálása - Implementáció által meghatározott kép Gyors hardveres implementálást tesz lehetővé. Forrás: Programming with OpenGL Part 0: 3D API http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./5. Az OpenGL részegységei és viszonyuk Polynomial Evaluator Per Vertex Operations & Primitive Assembly CPU Display List Rasterization Per Fragment Operations Frame Buffer Pixel Operations Texture Memory
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./6. Előzmények SGI és GL A Silicon Graphics (SGI) forradalmi újítása volt 1982-ben grafikus munkaállomásokon a pipeline A fenti hardver programozásához kidolgozták a GL (Graphic Library) függvénykönyvtárat A GL segítségével viszonylag könnyű volt 3D-s interaktív alkalmazásokat programozni. A GL sikere vezetett az OpenGL-hez 1992-ben, mely hardverplatform független grafikus API, grafikus programozói interfész lett, nyílt, ingyenes használattal. Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./7. Előzmények.. Az OpenGL jellemzői Könnyű vele látványos térbeli árnyalt grafikát készíteni Nagyon hardver közeli, sőt harveres implementációi is léteznek, ebből eredően kiemelkedő gyorsaságú A hangsúly az árnyalt megjelenítésen, renderelésen van Az ablakozó rendszerektől és input eszközöktől való függetlenség a rendszerfüggetlenség biztosítása érdekében Platformspecifikus sajátosságokat bővítményekkel tud kezelni Stabil működés A verziók visszafelé kompatibilisek Az Architectural Review Board felügyelőcsoport ellenőrzi (SGI, Microsoft, Nvidia, HP, 3DLabs, IBM, stb. Ma a Khronos Group. Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./8. Verziók, 2014: OpenGL 4.4 Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./9. OpenGL könyvtárak OpenGL alap (core) könyvtár: #include <GL/gl.h> OpenGL32 Windows-ra GL a legtöbb unix/linux rendszerre OpenGL Utility Library (GLU): #include <GL/glu.h> Magasabb szintű szolgáltatások az OpenGL-re épülve, mint pl. elemi (quadric) felületek (gömb, henger, stb.), képernyő- és világ koordinátarendszer közti átszámítás, NURBS spline, háromszögekre felosztás (tessellation), nézettartományok transzformációi, stb. A függvényei glu prefixszel kezdődnek, pl. gluortho2d(). Ablakozó rendszerekkel való kapcsolattartás függvényei GLX X window rendszerek WGL Windows AGL Macintosh. Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./10. OpenGL könyvtárak.. OpenGL ablakozó utility könyvtár (GLUT): #include <GL/glut.h> Az összes ablakozó rendszer esetén a közös feladatokra - Ablak megnyitása - Billentyű és egéresemények fogadása - Menük - Esemény vezérelt. A kód hordozható, de hiányzik a speciális platformokat is kielégítő funkcionalitás, pl. görgetőlecek hiányoznak. GLUT = Graphics Library Utility Toolkit. Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./11. OpenGL könyvtárak.. Szoftver szerkezet a kapcsolódó API-kkal Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./12. Az OpenGL renderelőként működik Geometriai primitívek Pontok (vertexek), vonalak és sokszögek Kép primitívek Képek és bitmap-ek Elkülönült pipeline a képek és a geometria kezelésére - A textura mappingon (ráfeszítésen) keresztül kapcsolódnak A renderelés az állapottól függ Színek, anyagjellemzők, fényforrásjellemzők, stb.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./13. OpenGL függvények Az OpenGL egy állapotgép Értékbeállítás (állapotváltoztatás), majd renderelés, ciklusban Az OpenGL függvények két családba tartoznak Primitivek generálása - Kimenetet okozhat, ha a primitív látható - Az állapot kontrollálja hogy a vertexek hogyan vannak feldolgozva, továbbá a primitívek megjelenését Állapot változtatás - Transzformációs függvények által - Attribútumváltoztató függvények által Az OpenGL nem objektum orientált Következésképpen eltérő típusú paraméterekkel működő azonos feladatú függvények léteznek, pl. glvertex3f, glvertex2i, glvertex3dv,.. Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./14. OpenGL függvények.. Függvényformátum függvénynév paraméter típusa glvertex3f(x,y,z) b - byte ub - unsigned byte s - short us - unsigned short i - int ui - unsigned int f - float d - double könyvtár dimenzió 2 - (x,y) 3 - (x,y,z) 4 - (x,y,z,w) paraméterek Vektor esetén: glvertex3fv(p) p a vektor neve Forrás: Programming with OpenGL Part 1: Background http://cg.csie.ntnu.edu.tw/cg/week02_opengl.ppt#256,1,programming with OpenGL Part 0: 3D API
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./15. OpenGL alkalmazás vázlatos felépítése Az OpenGL ablak konfigurálása és megnyitása Az OpenGL állapotgép inicializálása Az inputkezelő (eseménykezelő) GLUT függvények regisztrálása renderelés (rajzolás) átméretezés felhasználói adatbevitel, input: billentyűzet, egér, stb. Belépés az eseményfeldolgozó ciklusba (az események feldolgozása)
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./16. GLUT alapú minta OpenGL programváz void main( int argc, char** argv ) { int mode = GLUT_RGB GLUT_DOUBLE; glutinitdisplaymode( mode ); glutcreatewindow( argv[0] ); init(); // mindenféle kezdeti állapotbeállítás } //A később használandó függvények regisztrálása: glutdisplayfunc( display ); glutreshapefunc( resize ); glutkeyboardfunc( key ); glutidlefunc( idle ); //Belépés az eseménykezelő ciklusba, mely használja // a regisztrált függvényeinket: glutmainloop();
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./17. OpenGL inicializálás Az alkalmazni kívánt állapot beállítása void init( void ) { //szín- és mélységbuffer törlése: glclearcolor( 0.0, 0.0, 0.0, 1.0 ); glcleardepth( 1.0 ); //Fényforrás beállítása: glenable( GL_LIGHT0 ); glenable( GL_LIGHTING ); } //Mélységteszt engedélyezése: glenable( GL_DEPTH_TEST );
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./18. GLUT callback függvények Eseménykezelő függvények, melyek meghívódnak az esemény hatására Ablak átméretezés vagy újrarajzolás Kezelői input Animáció Az eseménykezelő függvények megadása, regisztrálás glutdisplayfunc( display ); glutidlefunc( idle ); glutkeyboardfunc( keyboard );
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./19. A rajzolási (renderelő) függvény Minden rajzoló műveletet ebben kell programozni glutdisplayfunc( display ); void display( void ) //Az ablak minden frissítésénél fut { glclear( GL_COLOR_BUFFER_BIT ); //Az ablak törlése glbegin( GL_TRIANGLE_STRIP ); //Háromszögek rajzolása glvertex3fv( v[0] ); glvertex3fv( v[1] ); glvertex3fv( v[2] ); glvertex3fv( v[3] ); glend(); glutswapbuffers(); //Buffercsere }
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./20. Az animációt léptető függvény Animációhoz használjuk a rajz mozgásparaméterének léptetésére glutidlefunc( idle ); void idle( void ) { t += dt; //Lépteti az időparamétert (mozgásparamétert) glutpostredisplay(); } Az animációhoz rajzok sorozatát kell generálni. A glutidlefunc() függvény intézi ezt. Lépteti a rajz paraméterét, hogy a következő ábra kissé eltérjen, majd a glutpostredisplay() függvény a glutdisplayfunc() mielőbbi futtatását kéri a rajz újrarajzolása érdekében.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./21. A felhasználói beavatkozás eseménykezelője Feldolgozza a felhasználói akciót glutkeyboardfunc( keyboard ); void keyboard( char key, int x, int y ) { switch( key ) { case q : case Q : exit( EXIT_SUCCESS ); //Kilép break; case r : case R : rotate = GL_TRUE; //Forgat break; } }
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./22. Rajzolási alapismeretek Geometriai primitívek Az OpenGL program állapotának kezelése OpenGL bufferek Az OpenGL pont (vertex) ( x, y, z, w ) homogén koordinátákkal van adva, mely megkönnyíti az eltolás és forgatás transzformációk egyetlen 4x4-es mátrixszal történő szorzással való elvégzését.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./23. OpenGL geometriai primitívek A geometriai primitívek csúcsait vertexekkel adjuk meg GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POLYGON GL_TRIANGLES GL_QUADS GL_QUAD_STRIP GL_TRIANGLE_STRIP GL_TRIANGLE_FAN
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./24. OpenGL geometriai primitívek.. Egyszerű példa: rombusz rajzolása void drawrhombus( GLfloat color[] ) { glbegin( GL_QUADS ); glcolor3fv( color ); glvertex2f( 0.0, 0.0 ); glvertex2f( 1.0, 0.0 ); glvertex2f( 1.5, 1.118 ); glvertex2f( 0.5, 1.118 ); glend(); } A rombusz síkbeli, mert z nincs megadva, így nulla. A pontokat glbegin( típus ); és glend(); között kell megadni. A pontokon kívül tetszőleges nem OpenGL utasítások is szerepelhetnek közöttük.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./25. OpenGL szín modellek RGBA vagy Color Index, az ablakozó rendszer igényli 1 2 4 8 16 color index mód: glindex*() 0 1 2 3 24 25 26 GLUT esetén a glutinitdisplaymode() használatos egy ( GLUT_RGBA), vagy egy ( GLUT_INDEX ) konstanssal. Red Green Blue 123 219 74 Display RGBA mód: glcolor*()
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./26. Nate Robin OpenGL oktatópéldái interaktívak A renderelés a vertexek színét interpolálja a belső pontok színének számításakor
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./27. A renderelés lehetőségei Lehetőségek huzalváztól Phong árnyaláson át textúra ráfeszítéséig
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./28. Az OpenGL állapotgép jellemzői Az összes renderelési jellemzőt az állapotgép foglalja magába Renderelési stílusok Árnyékolás Megvilágítás Textúra alkalmazása.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./29. Az OpenGL állapot manipulálása A megjelenést a renderelés előtti állapot határozza meg for each ( primitive to render ) { update OpenGL state } render primitive A vertex jellemzők manipulálása az állapotmanipulálás legáltalánosabb módja glcolor*() / glindex*() glnormal*() gltexcoord*()
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./30. Az aktuális állapot beállítása Állapotbeállítás glpointsize( size ); //pontméret gllinestipple( repeat, pattern ); //vonalstílus glshademodel( GL_SMOOTH ); //árnyalási modell Tulajdonságok engedélyezése glenable( GL_LIGHTING ); gldisable( GL_TEXTURE_2D );