openglsmolik/zpg/prednasky/opengl.pdf•nízkoúrovňováknihovna pro práci s 2d a 3d grafikou...
TRANSCRIPT
![Page 1: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/1.jpg)
Základy programování
OpenGL
![Page 2: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/2.jpg)
• Nízkoúrovňová knihovna pro práci s 2D a 3D grafikou
• Představuje jednotné API ▫ mezi programem a grafickým hardware
▫ nezávislost na cílové platformě
• Aktuální verze 4.5 (11. srpna 2014)
• Nepoužívá objektově orientované programování▫ primitiva jsou definována pomocí vrcholů, které obsahují:
souřadnice umístění bodu
barvu
normálu
texturovací souřadnice
OpenGL (Open Graphics Library)
![Page 3: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/3.jpg)
• OpenGL nepodporuje vstupní zařízení▫ klávesnice, myš, …
• Získání vstupu ze vstupních zařízení si musí uživatel zajistit sám▫ registrace callback funkcí
▫ registrace událostí
Interakce uživatele
![Page 4: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/4.jpg)
• Podpora geometrických primitiv, které lze vykreslit
Geometrická primitiva
![Page 5: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/5.jpg)
Souřadný systém v OpenGL
![Page 6: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/6.jpg)
• Soubor stavových proměnných
• Každé vlákno, které volá OpenGL funkce musí mít RC
• RC spojuje OpenGL s okením systémem Windows (nebo Linux, Mac)
• Inicializace v C#
Render Context
![Page 7: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/7.jpg)
• 3D vrchol lze předat pomocí mnoha příkazů:▫ glVertex3d, glVertex3dv -> double
▫ glVertex3f, glVertex3fv -> float
▫ glVertex3i, glVertex3iv -> int
▫ glVertex3s, glVertex3sv -> short
▫ glVertex3h, glVertex3hv -> ushort
Syntaxe příkazů
![Page 8: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/8.jpg)
Vykreslení 2D grafiky
![Page 9: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/9.jpg)
Vykreslení 2D grafiky
![Page 10: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/10.jpg)
• Nastavení aktuální matice pro geometrické transformace s objektem▫ glMatrixMode(GL_MODELVIEW);
▫ glLoadIdentity(); -> naplnění aktuální matice jednotkovou maticí
• Rotace o daný úhel (CCW) kolem osy dané vektorem▫ glRotatef(angle, vx, vy, vz);
• Posun o daný vektor▫ glTranslatef(dx, dy, dz);
• Změna měřítka▫ glScale(sx, sy, sz);
• Uložení aktuální transformační matice do zásobníku▫ glPushMatrix(); pro vrácení matice zavolat: glPopMatrix();
Geometrické transformace
![Page 11: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/11.jpg)
• Pozorovatel se může ve scéně pohybovat▫ pozice a směr pohledu lze vyjádřit transformační maticí
• C/C++▫ gluLookAt(eye.x, eye.y, eye.z, center.x, center.y, center.z, up.x, up.y, up.z)
• C#
Pohledová transformace
![Page 12: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/12.jpg)
• Přepnutí aktuální matice na matici projekce▫ glMatrixMode(GL_PROJECTION);
• Ortogonální (kolmá projekce)▫ glOrtho(left, right, bottom, top, near, far);
• Perspektivní (nejvíce používaná projekce)▫ gluPerspective(fovy, aspect, near, far);
▫ C#: Matrix.Perspective(fovy, aspect, near, far);
Projekce
![Page 13: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/13.jpg)
• Nutné používat depth buffer▫ glEnable(GL_DEPTH_TEST); // zapnutí depth testu
▫ glClearDepth(1.0f); // nastavení hodnoty na kterou se maze
• Vymazání bufferů▫ Maže se na začátku každého renderování
▫ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
• Nastavení vyřazení (nevykreslování) trojúhelníků▫ glEnable(GL.CULL_FACE); // povolení vyřazení (X glDisable(…))
▫ glCullFace(GL_BACK); // vyřazovat zadní Δ (nebo GL_FRONT)
▫ glFrontFace(GL_CCW); // Δ jsou CounterClockWise (nebo GL_CW)
Navíc používané ve 3D oproti 2D
![Page 14: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/14.jpg)
Osvětlení a nastavení světel
![Page 15: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/15.jpg)
Definice materiálu
![Page 16: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/16.jpg)
• Nastavení modelu stínování v OpenGL:▫ glShadeModel(GL_FLAT); nebo glShadeModel(GL_SMOOTH);
• Pro stínování jsou zapotřebí normály▫ glNormal3fv(…) -> stejné jako předání vrcholu
▫ GL_FLAT -> jedna normála pro trojúhelník
▫ GL_SMOOTH -> jedna normála pro každý vrchol
Metody stínování
![Page 17: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/17.jpg)
• Povolení používání 2D textury▫ glEnable(GL_TEXTURE_2D);
• Vygenerování texturovacího objektu▫ glGenTextures(1, &texture);
• Oznámení OpenGL jaká textura bude dále definována▫ glBindTexture(GL_TEXTURE_2D, texture);
• Nahrání 2D textury do GPU paměti▫ glTexImage2D(GL_TEXTURE_2D, 0, …);
• Nastavení parametrů používání textury▫ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
▫ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
▫ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
▫ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
Textury
![Page 18: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/18.jpg)
Textury
![Page 19: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/19.jpg)
Předkopírování dat na GPU
![Page 20: OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou •Představuje jednotné API mezi programem a grafickým hardware nezávislost na cílové](https://reader033.vdocuments.net/reader033/viewer/2022060823/609c40f388b8d4606b2da2d2/html5/thumbnails/20.jpg)
Vykreslení trojúhelníků