1 / 64

Számítógépes grafika

Számítógépes grafika. OpenGL 1. gyakorlat. Tartalom. OpenGL röviden Első program: üres képernyő Második program: rajzolás. OpenGL. SGI által elkezdett API, grafikus alkalmazások programozására Gyakorlatilag is cross-platform Eredetileg az SGI IRIS GL-jéből fejlődött ki

maire
Download Presentation

Számítógépes grafika

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Számítógépes grafika OpenGL 1. gyakorlat

  2. Tartalom • OpenGL röviden • Első program: üres képernyő • Második program: rajzolás

  3. OpenGL • SGI által elkezdett API, grafikus alkalmazások programozására • Gyakorlatilag is cross-platform • Eredetileg az SGI IRIS GL-jéből fejlődött ki • OpenGL Architecture Review Board kezelte kezdetekben • 2006 óta a Khronos Groupé az irányítás • OpenGL specifikáció: www.opengl.org

  4. OpenGL • Állapotgép, a Khronos által kezelt specifikációknak megfelelő driverek valósítják meg az utasításokat • Kliens-szerver jellegű, ahol a szerver a GL, a kliens az alkalmazás • Lehetőséget nyújt a szabványon túli kiegészítések elkészítésére is

  5. OpenGL • Verziók: • OpenGL 1.0: 1992. július 1. • OpenGL 2.0: 2004. október 22. • OpenGL 3.0: 2008. augusztus 11. • OpenGL 4.0: 2010. március 11. • Forrás: http://www.opengl.org/documentation/specs/

  6. OpenGL • Ezekre lesz szükségünk a CG-n kívül: • GLEW: http://glew.sourceforge.net/index.html • GLM (matematikai könyvtár): • http://glm.g-truc.net/download.html • Freeglut: • http://freeglut.sourceforge.net/index.php#download

  7. Visual Studio beállítása OpenGL-hez • Include könyvtárak közé: • glm-0.9.B.1\ • glew-1.5.3\include • freeglut-2.6.0\include • Library könyvtárak közé: • glew-1.5.3\lib • Szükséges lib fájlok: #pragmacomment(lib, "cg.lib") #pragmacomment(lib, "cgGL.lib") #pragmacomment(lib, "glew32s.lib")

  8. Konkrétan graflabban beállítandó • Tools/Options/Projects and Solutions/VC++ directories/ • Include files: • C:\Program Files\freeglut-2.4.0\include • T:\glew-1.5.3\include • Library files: • C:\Program Files\freeglut-2.4.0\ReleaseStatic • T:\glew-1.5.3\lib

  9. Konkrétan graflabban letöltendő • GLEW: • https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3.zip/download • https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3-win32.zip/download • GLM: • https://sourceforge.net/projects/glf/files/glm/glm-0.9.B.1/glm-0.9.B.1.zip/download

  10. Visual Studio beállítása OpenGL-hez • DLL fájlok amikre szükség lesz: • CG-hez cg.dll és cgGL.dll • glew.dll • freeglut.dll • (hacsak nem statikusan linkeljük utóbbi kettőt)

  11. GLUT • Segédkönyvtár, ami elfedi előlünk a Windows-os dolgokat • Mi a freeglut-ot fogjuk használni

  12. Extension-ök • Az alap OpenGL specifikáció lehetőséget nyújt bővítésre • Ezt ezeken a kiterjesztéseken keresztül lehet elérni • Tipikusan gyártó specifikus indíttatású egy-egy extension • Ha mindenkinek tetszik, akkor végül a szabvány része lesz (pl. vbo-k)

  13. OpenGL elnevezési konvenciók

  14. Tartalom • OpenGL röviden • Első program: üres képernyő • Második program: rajzolás

  15. Első OpenGL program • Készítsünk egy fekete képernyőt! • Program letölthető innen: http://people.inf.elte.hu/valasek/bevgraf/08/01_Create.zip

  16. main.cpp #define FREEGLUT_STATIC #include <GL/glew.h> #include <GL/freeglut.h> #include <windows.h> #include <iostream> #pragmacomment(lib, "glew32.lib") #pragmacomment(lib, "freeglut_static.lib")

  17. main.cpp int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitWindowSize(640, 480); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("OpenGL program"); ...

  18. glutInit • glutInit(int *argcp, char **argv) • A GLUT segédkönyvtár inicializálása • argcp: a programunk parancssorának számát tartalmazó módosítatlan változóra

  19. glutInit • glutInit( int *argcp, char **argv) • A GLUT segédkönyvtár inicializálása • argv: a tényleges parancssor

  20. glutInitWindowSize • glutInitWindowSize( int width, int height) • Létrehozandó ablak szélessége és magassága

  21. glutInitDisplayMode • glutInitDisplayMode(unsigned int mode) • A kezdeti megjelenítési tulajdonságok beállítása: • GLUT_RGBA: RGBA színmodell használata • GLUT_DOUBLE: dupla pufferelés használata • GLUT_DEPTH: mélységi puffer használata • További információk: http://www.opengl.org/documentation/specs/glut/spec3/node12.html

  22. glutCreateWindow • glutCreateWindow(char *name) • A paraméterben megadott feliratú ablak létrehozása

  23. main.cpp ... glutDisplayFunc(Render); glutIdleFunc(Idle); if (glewInit() != GLEW_OK) { std::cout << "Hiba!" << std::endl; return -1;} Init(); glutMainLoop(); return 0; }

  24. glutDisplayFunc • glutDisplayFunc(void (*func)(void)) • Egy callback függvényt adunk át a GLUT-nak, ami akkor hívódik meg, ha a kliensterületet újra kell rajzolni • A függvénynek így kell kinéznie: • void név(){ …}

  25. glutIdleFunc • glutIdleFunc(void (*func)(void)) • Egy callback függvényt adunk át a GLUT-nak, ami akkor hívódik meg, ha nincs feldolgozásra váró üzenete az ablakunknak • A függvénynek így kell kinéznie itt is: • void név(){ …}

  26. glewInit() • Inicializálja a glew-t (ez fogja betölteni az extension-öket)

  27. glutMainLoop() • Elindul a fő ciklusa a GLUT-nak • Ez csak akkor hívja a rajzoló callback-et, ha az ablakozó szerint újra kell rajzolni • Ezért mi az idle callback-ben mindig kiadunk egy render parancsot (glutPostRedisplay-t):

  28. main.cpp void Idle() { glutPostRedisplay(); }

  29. main.cpp void Init() { glClearColor(0,0,0,1); }

  30. glClearColor • glClearColor( GLclampf red, GLclampf green,GLclampf blue, GLclampf alpha); • Beállítja a törlési színt • Az egyes színkomponensek 0 és 1 közötti lebegőpontos számok kellenek, hogy legyenek

  31. OpenGL adattípus typedef-ek

  32. main.cpp void Render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); }

  33. glClear • glClear(GLbitfield mask) • Mit töröljünk: • GL_COLOR_BUFFER_BIT: a frame puffert (OpenGL-ül color buffer) • GL_DEPTH_BUFFER_BIT: mélységi puffert • GL_STENCIL_BUFFER_BIT: stencil puffert

  34. glutSwapBuffers • glutSwapBuffers() • A back és a front buffer megcserélése

  35. Feladat • 3 másodperc alatt feketéből váltson át a képernyő színe zöldre és vissza, szép folyamatosan

  36. Tartalom • OpenGL röviden • Első program: üres képernyő • Második program: rajzolás

  37. Második program • Rajzoljunk ki egy háromszöget!

  38. main.cpp • A main() és Idle() függvényeink nem változnak • Van egy új globális változónk, ez a Vertex Buffer Object-ünk (VBO) azonosítója lesz: • GLuint g_vb;

  39. main.cpp/void Init() void Init() { glClearColor(0,0,0.5f, 1); float geom[] = { -1, -1, 0.5f, 0, 1, 0.5f, 1, -1, 0.5f, }; ...

  40. OpenGL

  41. main.cpp/void Init() ... glGenBuffers(1, &g_vb); glBindBuffer(GL_ARRAY_BUFFER, g_vb); glBufferData(GL_ARRAY_BUFFER, sizeof(geom), geom, GL_STREAM_DRAW); }

  42. glGenBuffers • glGenBuffers( GLsizei n, GLuint * buffers) • Puffer objektumokat hoz létre • n darab puffert hoz létre • A buffers egy tömb, ami tárolni fogja a létrehozott pufferek azonosítóit

  43. glBindBuffer • glBindBuffer( GLenum target, GLuint buffer); • A második paraméterben megadott puffert hozza létre (rendeli a contexthez), vagy veszi használatba: • GL_ARRAY_BUFFER • GL_ELEMENT_ARRAY_BUFFER • GL_PIXEL_PACK_BUFFER • GL_PIXEL_UNPACK_BUFFER

  44. glBufferData • glBufferData( enum target, sizeiptr size, const void *data, enum usage) • A tényleges memóriafoglalás itt történik meg • Ha már létező pufferre hívjuk meg, akkor újrafoglalódik neki memóriaterület • Meglévő memória átírására: glBufferSubData

  45. glBufferData • glBufferData(enum target, sizeiptr size, const void *data, enum usage) • Milyen puffert hozunk létre: • GL_ARRAY_BUFFER • GL_ELEMENT_ARRAY_BUFFER • GL_PIXEL_PACK_BUFFER • GL_PIXEL_UNPACK_BUFFER

  46. glBufferData • glBufferData( enum target, sizeiptr size, const void *data, enum usage) • A létrehozandó puffer mérete bájtban

  47. glBufferData • glBufferData( enum target, sizeiptr size, const void *data, enum usage) • Memóriaterület, ahonnan feltöltődik a puffer a méretének megfelelő bájtnyi adattal

  48. glBufferData • glBufferData( enum target, sizeiptr size, const void *data, enum usage) • A puffer felhasználási módja, adatfeltöltés gyakoriságának szempontjából: • STATIC: csak egyszer lesz adat feltöltve rá • STREAM: használat után változó tartalom • DYNAMIC: többszöri változtatások, de egy-egy változtatás után többszöri felhasználás

More Related