Základy programování
OpenGL
• 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)
• 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
• Podpora geometrických primitiv, které lze vykreslit
Geometrická primitiva
Souřadný systém v OpenGL
• 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
• 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ů
Vykreslení 2D grafiky
Vykreslení 2D grafiky
• 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
• 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
• 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
• 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
Osvětlení a nastavení světel
Definice materiálu
• 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í
• 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
Textury
Předkopírování dat na GPU
Vykreslení trojúhelníků