OpenGLsmolik/zpg/prednasky/OpenGL.pdf•Nízkoúrovňováknihovna pro práci s 2D a 3D grafikou...

Post on 22-Dec-2020

0 views 0 download

transcript

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ů