1. Rysy OpenGL. Popište, které grafické operace OpenGL umožňuje a které nikoli. Rysy: - není hardwarově závislá - nemá žádné příkazy pro ovládání okenních úloh - není (pixel exact) pixelově přesný - stejná posloupnost příkazů může vést k mírně jiným výsledkům na různých platformách - můžeme použít různé algoritmy Co GL umí? - renderovat trojúhelníky, linky, polygony (3D) - manipulace s obrazem (2D) - texturování - osvětlení - stíny - mlhu - výpočet viditelnosti - alfa míchání (alfa blending) - transformace - akumulační buffer - stencil buffer … Co GL neumí? - okenní operace - definice objektů - NURBS - Stíny (vržené) - Odrazy - Voxely 2. OpenGL jakožto stavový automat. OpenGL je stavový automat – můžeme jej nastavit nebo se ptát na jeho stav
-
nastavování stavu: glEnable(), glDisable(), atd. získání stavu: glGetSomething()
3. OpenGL related API's. Popište a vysvětlete vztahy. -
platformově nezávislá okenní aplikace
-
platformově závislá okenní aplikace
4. Blokový diagram OpenGL. Nakreslete a vysvětlete význam jednotlivých uzlů diagramu.
Renderování obrázků
-
rychlejší datový přenos vyžaduje široký datový tok obvykle BitBlt (bit-block-transfer) instrukce
Renderování trojúhelníků
-
rasterizace je nejvíce důležitá z-buffer je po pixelech (per-fragment) mnoho věcí můžeme předpočítat
Renderování texturovaných mnohoúhelníků (první krok)
-
uložení textury do paměti připravení pro další použití
Renderování texturovaných mnohoúhelníků (druhá část)
-
použití textury
5. Vysvětlete princip pipeliningu v OpenGL a uveďte příklady. -
OpenGL je zamýšlena jako pipeling (potrubní) architektura Každá jednotka má jednu instrukci paralelně Aplikace může mít prospěch (application can benefit) Velké množiny dat mohou být renderovány efektivně Můžeme používat dříve uložené informace (triangle strip)
6. Popište kompletní syntax příkazů OpenGL a uveďte příklad.
Typ Volání procedury Konstanty Datový typ
Prefix gl GL_ GL
Příklad glPopMatrix() GL_FOG_COLOR Glfloat
Typický příkaz:
Prefix
jméno příkazu
počet a typ argumentů (tři floaty)
Sufix b s i ub us ui
Datový typ 8 bit integer 16 bit integer 32 bit integer 8 bit uns. int 16 bit uns. int 32 bit uns. int
Typicky C singed char short int unsigned char unsigned short unsigned long
f d
32 bit float 64 bit float
float double
„v“ syntax některé příkazy mohou končit v glColor3fv(color) argument je pak vektor GLfloat color[]={1.0,0.0,1.0} glColor3fv(color); a GLfloat r=1.0, g=0.0, b=1.0 glColor3f(r, g, b) jsou ekvivalentní ale první příkaz je obvykle rychlejší. glVertex2i(1,3) je ekvivalentní glVertex2f(1.0, 3.0) ale někdy je závislý na kontextu např. barva je <0.0,1.0> GLdouble <0,255> GLbyte <-128,127> GLubyte atd.
OpenGL definice GLbyte GLshort GLint, GLsizei GLubyte GLushort GLuint, GLenum, GLbitfield GLfloat, GLclampf GLdouble, GLclampd
7. Vynucené dokončení vykreslování scény. K čemu slouží a kdy je vhodné je použít? OpenGL je grafická pipeline (roura) pro optimalizaci některých příkazů může být upevněna pomoci dvou „chimney-sweeper“ command void glFlush() void glFinish() glFlush() příkaz donutí OpenGL k dokončení všech dříve spuštěných příkazů v konečném (finite) čase glFinish() příkaz donutí OpenGL k dokončení všech dříve spuštěných příkazů a čeká na jejich výsledek 8. Vykreslování jednoduchých objektů. glBegin(), glEnd(), principy a vykreslování jednotlivých primitiv. - všechno v OpenGl je složeno z vrcholů - důležité výpočty jsou založeny na vrcholech (světlo) - vrchol je určen v homogenních kartézských souřadnicích [x, y, z, w] Kartézské souřadnice [X, Y, Z] jsou určeny jako [X, Y, Z] = [x/w, y/w, z/w] poznámka: pro w<0 výsledek není garantován void glVertex{234}{sifd}[v](souřadnice) Pokud w souřadnice není určena je defaultně 1.0 Pokud z souřadnice není určena je dafaultně 0.0 - všechny vnitřní výpočty jsou v 3D glBegin … glEnd paradigma glBegin příkay nastaví OpenGl do stavu „nyní kresli něco“ glEnd příkaz řekne že toto je konec ve smyslu sémantické závorky glBegin(GL_POINTS) glBegin(GL_LINES) glBegin(GL_LINE_STRIP) glBegin(GL_LINE_LOOP) glBegin(GL_TRIANGLES)
glBegin(GL_TRIANGLE_STRIP) glBegin(GL_TRIANGLE_FAN) glBegin(GL_QUADS) glBegin(GL_QUAD_STRIP) glBegin(GL_POLYGON) 9. Polygons - face culling. Popište k čemu slouží, jak funguje a uveďte příklady. -
polygon je množina vyplněných pixelů ohraničených hranicí má dvě strany přední(front) a zadní(back) můžeme vyřadit neviditelné plochy před rasterizací (Z-buffer)
-
to se nazývá back face culling defaultní hodnota: obě plochy jsou renderovány – zabírá čas
-
určení vykreslovacího módu plochy
void glPolygonMode(GLenum face, GLenum mode) kde face - GL_FRONT, GL_BACK, GL_FRONT_AND_BACK mode – GL_POINT, GL_LINE, GL_FILL Polygon je vykreslován jako body, linky (hraniční čára), nebo vyplněný - defaultně: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) -
přední plocha má vrcholy v uspořádání proti směru hodinových ručiček (CCW) zadní plocha má vrcholy v uspořádání ve směru hodinových ručiček (CW)
přední -
zadní
a tuna dalších věci
10. Vysvětlete použití příkazu glEdgeFlag() a uveďte příklad. -
v glPolygonMode(GL_FRONT, GL_LINE) módu jsou všechny čáry brány jako hraniční můžeme určit které jsou a které ne pomocí:
void glEdgeFlag(GLboolean flag) void glEdgeFlagv(const GLboolean *flag) kde flag určuje vrchol zda je hraniční hrana vrchol je GL_TRUE (default) nebo GL_FALSE poznámka: to může fungovat pro všechny druhy mnohoúhelníkůa le Microsoft-tí implementace po Wokna pracuje jen pro GL_POLYGON 11. glPolygonStipple(), glLineStipple(). Vysvětlete použití, uveďte příklad. -
polygon může být vyplněn vzorkem 32 bit x 32 bit
void glPolygonStipple(const BLubyte *mask) kde mask je ukazatel na 32 bit x 32 bit unsigned bytes Poznámka: UNIX program bitmap není přesně totéž Poznámka: pixely jsou interpretovány podle glPixelsStore*() módu (bude vysvětleno později) glLineStipple(pattern, factor) -- to nechápu slide 25 přednáška 03
12. Co je to rasterizace, kde, kdy a jak probíhá? Vysvětlete význam pojmu fragment z hlediska OpenGL. … je proces převodu primitiv do 2D obrazu dvě části: (kde a co)
1) které čtverečky okenní mřížky je zabráno 2) přiřazení barvy a hloubkové hodnoty pro každý čtverec výsledek je poslán do per-fragment operační jednotky
Fragment: Čtvereček mřížky podle které jsou přiřazovány parametry - barva (RGBA nebo index) - z (hloubka) hodnota - souřadnice v textuře je nazýván fragment parametry jsou nazývány asociovaná data fragmentu jsou umístěny podle levého spodního roku – leží vždy na integer hodnotě Střed fragmentu je offset 1/2 x a y od středu(..by 1/2 x and y by the center) (je to vždy půl integer) … 13. Glut basis. Co je to Glut, co všechno umožňuje a jaké je jeho použití? The OpenGL Utility Toolkit (GLUT) je programovací interface pro psaní OpenGL programů nezávislých na window systémů. GLUT podporuje následující funkcionalitu: -
Vícenásobná okna pro OpenGL renderování řízení událností idle (smyčka) rutiny a časovače pop-up menu Procedury pro generování plných a drátových objektů Podporu bitmap a (stroke) fontů
14. Glut initialisation Co všechno může obsahovat a jak se používá inicializace Glutu. void glutInit(int *argcp, char *argv[]) kde argcp – argc proměnná z main argv – argv proměnná z main -
inicializuje GLUT knihovnu a vyjedná session s window systémem může ukončit program s chybovou zprávou, když systém nepodporuje OpenGL
-
parametry procesu z příkazové řádky ale je specifické parsování parametrů závislé na window systému void glutInitWindowSize(int w, int h) void glutInitWindowPosition(int x, int y) kde w h x,y
je šířka okna v pixelech je výška okna v pixelech je pozice okna v pixelech
void glutInitDisplayMode(unsigned int m) m určuje display mode je logický součet display mode bit masek: GLUT_RGBA RGBA mode (default) GLUT_INDEX INDEX mode (přepisuje RGBA) GLUT_RGB alias pro GLUT_RGBA GLUT_SINGLE jeden buffer (default) GLUT_DOUBLE dva buffery GLUT_ACCUM akumulační buffer GLUT_ALPHA alfa komponenty GLUT_DEPTH hloubkový (Z) buffer GLUT_STENCIL stencil buffer GLUT_STEREO stereo projekce Příklad: glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_SINGLE) určuje často používaný mód, RGBA barevný mód, jeden buffer a Z-buffer 15. Glut event process. Co všechno může obsahovat a jak se používá zpracování událostí v Glutu. -
některé události v okně může znamenat nějaké akce, např. stisk klávesy, stisk tlačítka myši, exposing okna, překreslení okna, atd. každé akci může být přidělena procedura argumenty procedury nesou nějaké informace o událostech
void glutDisplayFunc(void (*foo)(void)) - funkce void foo(void) je volána když okno je (pře)vykreslováno (minimalizováno, atd.) void glutRedisplayFunc(void (*foo)(int w, int h)) - funkce void (*foo)(int w, int h) je volány když se změní velikost okna w a h je šířka a výška okna
void glutKeyboardFunc(void (*foo)(unsigned char key, int x, int y)) - funkce void (*foo)(unsigned char key, int x, int y) je volána když je stištěna klávesa. key je stištěná klávesa a x a y určují pozici myši … 16. Glut windows management. Co všechno obsahuje a jak se používá správa oken v Glutu. int glutCreateWindow(char *name) -
vytvoří hlavní (top level) okno nazvané name renderování je neúčinné dokud není zavolán glutMainLoop není zavolán vrací unikátní číslo
int glutCreateSubWindow(int win, int x, int y, int w, int h) vytváří pod-okno win na relativní pozici [x, y] w x h pixelů velké void glutSetWindow(int n) nastaví okno a jako aktuální int glutGetWindow(void) získá číslo aktivního okna void glutDestroyWindow(int n) zruší okno n void glutPositionWindow(int x, int y) změní pozici aktuálního okna void glutReshapeWindow(int w, int h) změní velikost okna void glutFullScreen(void) void glutPopWindow(void) void glutPushWindow(void)
void glutShowWindow(void) void glutHideWindow(void) void GlutIconifyWindow(void) Příklad: glutFullScreen(void); glutSetCursor(GLUT_CURSOR_NONE); nastaví full screen bez kurzoru 17. Co jsou to homogenní souřadnice? Uveďte a vysvětlete Plückerovu a Möbiovu definici homogenních souřadnic.
-
Homogenní souřadnice mají přirozenou aplikaci v počítačové grafice Formují základy pro projektivní geometrii užívanou značně pro projekci třídimenzionální scény do dvou-dimenzionálního obrazu Sjednocují ošetření běžných grafických operací.
Začneme s dvou-dimenzionálním příkladem a pak použijeme intuici získaný pro prezentaci aplikace homogenních souřadnic ve třech dimenzích. Möbius: Daný fexed trojúhelník v rovině, Möbius definoval množinu homogenních souřadnic pro bod p jako váhy požadované ve vrcholech trojúhelníka jako to p become těžiště trojúhelníka.
Bod p je vypočten jako (waa,wbb,wcc) wa + wb + wc = 1 => barycentrické souřadnice Plücker: Uvažme označenou (signed) vzdálenost od bodu ke hranám pevného trojúhelníka.
-
a+1 souřadnice reprezentují a-dimenzionální bod Jeden okamžitý atribut systému je invariant bodu když měníme velikost (scaled): změna velikost Möbiusových vah z velikosti Plückerových souřadnic nemění pozici p
18. Definujte homogenní souřadnice pro projektivní rovinu a ideální (nekonečně vzdálené body). Homogenní souřadnice pro projektivní plochu -
Plücker realizoval že homogenní souřadnice [x, y, w] poskytli změnu velikosti (scale) invariant reprezentace pro body (x´, y´) v Euklidovské rovině, s x´ ≈ x/w, y´ ≈ y/w a w≠0 Pohlížel na homogenní bod s w = 0 jako odpovídající bodům v běžné rovině protože jsou nekonečně daleko. Běžná rovina rozšířená o body v nekonečnu je známa jako projektivní rovina.
Popisujeme projektivní rovinu pomocí uvážení všech čar a rovin procházející skrz daný bod s. Pokud jsou protnuty rovinou P která neprotíná s, všechny body (nebo přímky) na P mohou být přidruženy s přímkou (nebo plochou) skrz s.
-
Podle dohody paralelní přímky jsou nazývány průniky P na ideálních (nekonečně vzdáleném) bodech. Projektivní rovina ρ2 je uvážena pro obsahování obou ideálních bodů a ideální přímky.
Následující sdělení každé definuje dvou-dimensionální projektivní prostor ρ2:
1) Množina všech tříd ekvivalence uspořádaných trojic nenulových vektorů v ε3, kde ekvivalence je vzájemná úměrnost(mutual proportionality) dvou vektorů. 2) Množina všech přímen (lines) procházejících počátkem ε3 3) Množina všech dvojic opačných bodů z S2, jednotková koule v ε3 V praxi, homogenní souřadnice reprezentují ρ2 pomocí mapování všech euklidovských bodů (x´, y´) ∈ ε2 do [x, y, z] ∈ ε3 (w ≠ 0), který je počet ekvivalenčních tříd bodů v ρ2. Mapování je dosažen pomocí ekvivalencí x´ ≈ x/w, y´ ≈ y/w ρ2 není vektorový prostor v stejném chování jako ε3 19. Popište homogenní souřadnice ve 2D, uveďte význam a maticový zápis pro translace, rotace a scaling. Homogenní souřadnice pro dvě dimenze Důležitý, praktický aspekt systému homogenních souřadnic je jejich sjednocení posunutí, změny velikosti (scaling) a rotací geometrických objektů. V Euklidově prostoru, hlavní afinní mapování je:
-
-
p´ a p jsou body v ε3 A je 2x2 matice reprezentující změnu velikosti (scaling) a rotaci c reprezentuje posunutí
Pokud p je reprezentováno homogenním bodem [px, py, 1] a 2x3 matice je použita s posunutím může být zacházeno stejně jako rotací a změnou velikosti (scaling):
Konzistentnější a jednodušší výsledek je získán pomocí zahrnutí třetí (homogenní) souřadnice do výsledku:
Nyní sumarizujeme použití homogenních souřadnic.
Afinní Transformace
20. Popište homogenní souřadnice a jejich použití pro perspektivní projekce ve 3D. Je dobře známo že matice 3x3 může reprezentovat třídimenzionální změnu velikosti (scale) a rotaci, ale ne posunutí. Jako ve dvou-dimenzionálním případě, posunutí začíná být možný s přidáním řádku a sloupce do matice:
Perspektivní projekce Renderování objektů v ε3 je přirozeně vykonáváno její projekce do ε2
Homogenní souřadnice reprezentují projekci Obrázek reprezentuje boční pohled
Obrázek bodu (x´, y´) je počítán z objektového bodu (x, y, z) pomocí podobných (similar) trojúhelníků.
Jako D přiblížení nekonečna, w´ = 1/D blízké 0 a transformované body získají nekonečnou vzdálenost. 21. Popište jednotlivé typy transformací v OpenGL a místa a způsoby jejich použití. -
pod z CG je pro vytvoření 2D obrazu 3D objektů potřebujeme myslet ve 3D
-
způsob jak to získat – transformace transformace (v pořadí použití): - viewing - modeling - projection - cliping - viewport
Analogie kamery
Stavy transformací bodu
-
-
souřadné systémy - objekty - používaný pro definování objektu - kamera(oko) - pozice pozorovatele - clip - normalizované zařízení - okno - měřené v pixelech Pohled složený z částí: positioning(umístění) a projekce OpenGL podporuje ortografické a perspektivní projekce některé další projekce mohou být definovány „ručně“ souřadný systém je reprezentováno jako matice transformace je reprezentována jako maticové násobení matice jsou typu 4x4
22. Popište transformační matice, příkazy pro práci s nimi a použití. -
Nový (transformovaný) vrchol souřadnice v´ je vypočten z - starého: v - a matice: M v´=Mv (vždy na pravé straně)
void glMatrixMode(GLenum mode) kde mode je
GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE
následující příkazy se projeví na určené matici (pamatujte je to pipelining) -
zobrazení a modelové transformace jsou nevyprostitelně související s OpenGL a jsou ve skutečnosti kombinovány v jedné modelview matici ale to je jednodušší přemýšlet o tom touto cestou můžeme umístit kameru dvěma způsoby - posunutím objektů (modeling transformations) - posunutím kamery (viewing transformations)
void glLoadIdentity(void) -
nastaví modifikační matici na 4x4 matici identity
void glLoadMatrix{fd}(const TYPE *m) nastaví příslušné hodnoty matice tak jak je určeno v m poznámka: glMatrixMode(GL_PROJECTION); glLoadmatrix(myMatrix); je způsob jak definovat vlastní projekci například dvoubodovou projekci void glMultMatrix{fd}(const TYPE *m)
vynásobí příslušnou hodnotu matice šestnácti hodnotami v m, a uloží výsledek jako příslušnou matici -
pamatujte, je to násobení zprava
23. Vysvětlete globální a lokální přístup k transformacím. Uveďte příklady. Jak můžeme rozumět transformacím? první přístup: velký fixovaný systém souřadnic příklad:
- příslušná matice je C = NML - body jsou transformovány v´ = Cv = NMLv Ö vektor je nejprve transformován pomocí L transformace! poslední volaná transformace je první aplikována na vrchol => musíme určit matice v opačném pořadí Jak můžeme rozumět transformacím? druhý přístup: lokální souřadný systém svázaný s objektem -
operace jsou aplikovány na lokální souřadný systém
-
operace se vyskytují v přirozeném pořadí
-
druhý přístup je užitečnější pro modelování množin kloubů (ruka robota)
-
druhý přístup je problematický v případě změny velikosti (neuniformní ~ osy mohou být nekolmé)
-
pohledová transformace mohou být provedeny před modelovými transformacemi v programu
Ö pohledové transformace se provedou první -
modelové transformace jsou diskutovány první pohledové transformace jsou provedeny první
např. nejprve vytvoříme scénu než nastavíme kameru 24. Popište „Modeling transformations“, uveďte příkazy pro práci s nimi a tvary matic pro posun a zvětšení.
- je příliš složité určit transformaci pomocí matice Ö jsou předdefinované transformace v OpenGL -
takzvané afinní transformace jako translation, rotation a scaling
-
to je obvykle mnohem rychlejší než používání matic, protože to může být provedeno hardwarem
void glTranslate{fd}(TYPE x, TYPE y, TYPE z) kde x, y, z určuje posunutí, tento příkaz provede násobení příslušné matice maticí T:
void glScale{fd}(TYPE x, TYPE y,
TYPE z)
kde x, y, z určují změny velikosti ve směru os x, y, z
25. Popište „Viewing transformations“, uveďte příkazy pro práci s nimi a příklady použití. Nápověda: ??(Gldouble eyeX,GLdouble eyeY,GLdouble eyeZ, GLdouble posX,GLdouble posY,GLdouble posZ, GLdouble upX,GLdouble upY,GLdouble upZ) -
Můžeme umisťovat kameru dvěma způsoby - posunutím objektů (modeling transformations) - posunutím kamery (viewing transformations)
-
jsou aplikace rotace, posunutí a změny velikosti(scale) kamery
-
posun kamery = posun všech objektů v opačném směru rotace kamery CW = rotace všemi objekty CCW zobrazení transformačních příkazů může být voláno před modelovacími počáteční pozice a orientace kamery například po
-
pozice [0, 0, 0]
-
pohled směrem (0, 0, -1)
-
pozice kamery ve 3D prostoru je příliš složitá může být zjednodušena pomocí funkce knihovny GLU
26. Popište „Projection transformations“, uveďte příkazy pro práci s nimi a příklady použití. Vysvětlete výpočet „fovy“. Nápověda: ??(GLdouble left,GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far), ??(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar). jsou nastaveny pomocí glMatrixMode(GL_PROJECTIVE) - účelem je definovat zobrazovaný obsah (viewing volume) - objekty v tomto obsahu jsou renderovány - ostatní jsou odstraněny (clipped) Projektivní transformace mohou být: - ortografické projekce (paralelní) - perspektivní projekce - uživatelem definované
Uživatelem definované projekce dosažena pomocí:
kde m definuje projekční matici, např. dvoubodovou perspektivu, axonometrii atd. ortografická projekce - velikost objemu není měněna - velikost projektovaných objektů nezávisí na vzdálenosti od kamery - užívá se v CAD, architektonických pohledech atd. ( kde aktuální úhly jsou rozhodující) perspektivní projekce - objekty jsou promítány směrem k vrcholu kamery - objekty blíže kameře jsou větší - užívá se pro simulaci reality (podobné lidskému oku)
-
fovy je zorné pole v ose y aspect je (aspect ratio) poloměr x a y aktuálního záběru (viewport) může být asymetrický (někdy požadováno)
Jak nastavit fovy pro vzdálenost a velkost objektu?
28. Popište „Clipping transformations“ a „Viewport transformations“, Uveďte příkazy pro práci s nimi a příklady použití. nastavení viewportu void glViewport(GLint x, GLint y, GLsizei w, GLsizei h) -
x a y určuje spodní dolní roh w a h jsou velikosti obdélníku záběru (viewport)
Příklad: rednerování ve dvou viewportech
transformace z souřadnice void glDepthRange(GLclampd near, GLclampd far) -
defaultní hodnoty
near = 0.0
far = 1.0 -
toto je zamýšleno pro jednodušší manipulaci pokud určíte různé hodnoty, všechno je transformováno do [0.0, 1.0] v OpenGL
s ořezávacími rovinami (clipping planes) se musí zacházet opatrně
-
můžeme přidat více ořezávacích rovin void glClipPlane(GLenum plane, const GLdouble *eqn)
-
plane je GL_CLIP_PLANE0, …, GL_CLIP_PLANE5 *eqn je ukazatel na pole čtyř čísel A, B, C, D a Ax + By + Cz + D = 0 určuje rovinu body (x y z w) odpovídající (A B C D)M-1(x y z w)T >= 0 nejsou renderovány (M je příslušná modelview matice) plocha musí být povolena např: glEnable(GL_CLIP_PLANE1)
Příklad:
29. Popište „Display lists“, princip, způsob použití a příkazy. Uveďte jednoduchý příklad. -
display list je skupina příkazů uložených pro pozdější spuštění
-
To je občas nazýváno retained(zadržený) mode zatímco „normální“ renderování je immediate(okamžitý) mode to je účinné zejména v síťovém prostředí ale je to alespoň tak rychle jako immediate mode jednou je display list vytvoře a nemůže být modifikován mohou být vytvořeny hierarchicky
Co je obvykle účinnějšího na display listech: - maticové operace množina příkazů je vyhodnocena do jedné matice složité výpočty jsou předpočítány je voláno jen glMultMatrix() - bitmapy a textury jsou uloženy do hardwaru vhodný formát - světla, vlastnosti materiálu něco může být předpočítáno - tečkování (stippling) polygonu Vytváření display listu void glNewList(GLuint list, GLenum mode) kde list je unikátní číslo určené uživatelem mode jedno z GL_COMPILE, GL_COMPILE_AND_EXECUTE void glEndList() ukončuje definici display listu void glCallList(GLuint list) spouští dříve definovaný display list zakázané příkazy v display listu - dotazovací příkazy glIs*(), glGet*(), glReadPixels(), glSelectBuffer() - manipulace s display listem glDeleteLists(), glIsList(), glGenLists() - a některé další glFlust(), glFinish(), glRenderMode(), glPixelStore(), glFeedbacBuffer() -
když vytváříme display list pokud je číslo již použito display list je vymazán
GLboolean glIsList(GLuing list) vrací TRUE pokud číslo je použito GLuint glGenList(GLsizei range) - alokuje spojitý rozsah display-listy indexů nebo nulu - vrací ukazatel na první z nich void glDeleteLists(GLuint list, GLsize range) - smaže display listy a nastaví indexy jako volné hierarchické display listy
30. Popište rozpoznávání barev lidským okem, a chromatický diagram.
C
K hlubšímu pochopení problematiky barev je nutno vědět více o vnímání barev lidským okem. V něm jsou umístěny receptory citlivé na určité vlnové délky světla, teda na paprsky určité barvy. Na základě podnětů od různých typů receptorů je v mozku složena odpovídající barva, resp. barevný vjem. Chromatický diagram CIE (commission Internationale de l´Éclairage) Každá skutečná barva je ve standardu určena množstvím základních barev potřebných pro její vytvoření. Označme pro danou barvu tato množství barev jako A, B a C. V normalizovaném tvaru je zapíšeme jako A B C x = -----------------, y = ------------------, z = -----------------------A+B+C A+B+C A+B+C Protože platí, že x+y+z = 1, stačí k úplnému určení bervy libovolné dvě složky. Vybereme-li například x a y, můžeme reprezentovat všechny barvy dvojrozměrným diagramem. Křivka, která ohraničuje barvy viditelného spektra, se nazývá chronomatický diagram CIE. Barevné body tvořící obalovou spektrální křivku jsou označeny vlnovou délkou v nanometrech počínaje červenou části spektra a konče fialovou částí spektra. Bod C v diagramu odpovídá poloze bílého světla. V anglické terminologii je tento bod označován jako illuminant C a je považován jako standard pro průměrné denní světlo.
PV112 – Vypracované otázky 31 – 50
Vypracoval Martin Herodes
31. Uveďte jakým způsobem se zapínají světla v OpenGL. Popište nastavení vlastností světel v OpenGL. - OpenGL pracuje s barvami nebo se světly. Příkazy pro přepínání mezi těmito módy jsou: glEnable(GL_LIGHTING); // povolení osvětlení glDisable(GL_LIGHTING); // zakázání osvětlení Použití barev – specifikujeme barvu u každého vrcholu Použití světel – barva každého vrcholu je vypočítána podle Dopadajícího světla a vlastností materiálu - OpenGL podporuje nejméně 8 světel GL_LIGHT0,…, GL_LIGHT7 Každé n-té světlo musí být povoleno příkazem: glEnable(GL_LIGHTn); - Nastavení vlastností světel příkazem: glLight{if}[v](GLenum light,GLenum p,TYPE val); kde light=GL_LIGHTn (které světlo nastavujeme) p=jeden z možných parametrů val=je hodnota Parametry: GL_AMBIENT – intenzita okolního světla př. (0.0,0.0,0.0,1.0) GL_DIFFUSE – intenzita rozptýleného světla př. (1.0,1.0,1.0,1.0) nebo (0.0,0.0,0.0,1.0) GL_SPECULAR – barva odlesku světla př. (1.0,1.0,1.0,1.0) nebo (0.0,0.0,0.0,1.0) GL_POSITION – pozice světla (x,y,z,w) př. (0.0 ,0.0, 1.0, 0.0) pozice (x,y,z,1) znamená lokální světlo – local light pozice (x,y,z,0) znamená směrové světlo – directional light GL_SPOT_DIRECTION - směr bodového světla (x,y,z) př. (0.0, 0.0, -1.0) GL_SPOT_EXPONENT – exponent bodového světla př. 0.0 (koncentrace světla) GL_SPOT_CUTOFF – úhel ořezání bodového světla př. 180.0 nebodové světlo GL_CONSTANT_ATTENUATION - konstantní faktor útlumu př. 1.0 (c1) GL_LINEAR_ATTUNEATION - lineární faktor útlumu př. 0.0 (c2) GL_QUADRATIC_ATTUNEATION – kvadratický faktor útlumu př. 0.0 (c3)
- Stínování: glShadeModel(GLenum mode); kde mode=GL_FLAT nebo GL_SMOOTH GL_FLAT – nastavení konstantního stínování GL_SMOOTH – nastavení Gouraudova stínování 32. Popište nastavení vlastností světelného modelu v OpenGL. - každé světlo přispívá ke zvýšení intenzity okolního světla můžeme nastavit globální osvětlení GLfloat color = {0.2, 0.2, 0.2, 1.0}; glLightModefv(GL_LIGHT_MODEL_AMBIENT,color); - pozice pozorovatele ovlivňuje hlavně odraz světla. Pokud je pozorovatel v nekonečnu, je výpočet mnohem jednodušší (rychlejší). glLightModefv(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE); defaultně jsou osvětleny jen přední plošky. Zapnutí osvětlení zadních plošek příkazem: glLightModefv(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); - barva odrazu je počítána odděleně od výpočtů ambientní a difuzní barvy a je aplikována až po texturování - glLightModefv(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); default value: GL_SINGLE_COLOR 33. Popište nastavení vlastností materiálů pro osvětlení v OpenGL. Nastavení vlastností materiálu příkazem: void glMaterial{if}[v](GLenum face, GLenum p, TYPE val) kde face = GL_FRONT, GL_BACK, nebo GL_FRONT_AND_BACK p = jeden z možných parametrů val = je hodnota Parametry: GL_AMBIENT – příspěvek k ambientnímu světlu př. (0.2,0.2,0.2,1) GL_DIFFUSE – příspěvek k difuznímu světlu př. (0.8,0.8,0.8,1) GL_AMBIENT_AND_DIFFUSE GL_SPECULAR – příspěvek k barvě odlesku světla př. (0,0,0,1) GL_SHININESS – exponent př. 0.0 [0.0 –128.0] GL_EMISSION – samostatné osvětlení př. (0,0,0,1) - objekt může mít odlišný materiál uvnitř a venku
- nejdůležitější je difuzní složka materiálu, protože nejvíce určuje výslednou barvu - difúzní odraz NEZÁVISÍ na pozici pozorovatele (diffuse reflectance) - zrcadlový odraz ZÁVISÍ na pozici pozorovatele (specular reflectance) - v reálném světě jsou difuzní a ambientní složky materiálu stejné parametr GL_AMBIENT_AND_DIFFUSE - na objektech se objevuje světlo, ale není přítomen světelný zdroj! Volání glMaterial() je náročné. Proto se při více změnách materiálových vlastností používá příkaz void glColorMaterial(GLenum face, GLenum mode) kde face = GL_FRONT, GL_BACK, nebo GL_FRONT_AND_BACK mode = GL_AMBIENT, GL_DIFFUSE atd. Používáme, když se vlastnost materiálu mění pro více vrcholů. Musí být použit příkaz glEnable(GL_COLOR_MATERIAL). Příklad:
glColorMaterial(GL_FRONT,GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glColor3fv(color1); Render1(); glColor3fv(color2); Render2(); glColor3fv(color3); Render3(); glDisable(GL_COLOR_MATERIAL);
34. Uveďte, jakým způsobem probíhá výpočet barev v osvětlovacím modelu OpenGL. V osvětlovacím modelu OpenGL probíhá výpočet barev odděleně pro červenou, zelenou a modrou složku. Je to jednodušší. Všechny barevné složky (emission, ambient, diffuse a specular) jsou sečteny a následně převedeny do rozsahu [0,1].
Difuzní složka nezávisí na pozici pozorovatele a je větší, když světlo dopadá kolmo na povrch
Odrazová složka (specular reflection) závisí na pozici pozorovatele. 35. Popište „Blending“ v OpenGL, způsob výpočtu barev, používané funkce a často používané parametry. Ukažte použití na příkladu. Popište rozdíly ve 2D a 3D. Blending vytváří průhlednost části scény. Průhlednost zajišťuje alfa kanál. Blending nepracuje v barvovém módu. Musí být povolen příkazem glEnable(GL_BLEND). Obsahuje dvě části – zdroj a cíl. - Rovnice blendingu: zdrojová barva (Rs, Gs, Bs, As) cílová barva (Rd, Gd, Bd, Ad) zdrojový faktor blendingu (Sr, Sg, Sb, Sa) cílový faktor blendingu (Dr, Dg, Db, Da) nová čtveřice RGBA: (Rs.Sr+Rd.Dr, Gs.Sg+Gd.Dg,Bs.Sb+Bd.Db, As.Sa+Ad.Da) - faktor blendingu může být odlišný pro každou komponentu glBlendFunc(GLenum src, GLenum, dst) kde src, dst specifikují faktor blendingu pro zdroj a cíl Faktory blendingu: (většina aplikací využívá jen malou podmnožinu)
- Využití blendingu – billboarding – pozadí obrázku přiřadíme nulový alfa kanál a následně se objekt zobrazí bez pozadí - Vypnutí z-bufferu příkazem glDepthMask(GL_FALSE) zapnutí GL_TRUE Výsledná barva závisí na pořadí rendrování, protože při vypnutí z-bufferu ztrácíme informace o hloubce objektů ve scéně. Proto bychom měli pro správné zobrazení objekty seřadit podle hloubky a následně vykreslovat zepředu dozadu. - ve 2D se na rozdíl od 3D nemusíme starat o seřazení podle hloubky Příklad: glDepthMask(GL_FALSE); // Z-buffer v rezimu read-only glEnable(GL_BLEND); // povoleni michani glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// michaci funkce render(); // vykresleni průhledných ploch glDepthMask(GL_TRUE); // Z-buffer v rezimu readwrite glDisable(GL_BLEND); // zakazani michani 36. Uveďte příklady „Aliasingu“. Popište principy „Antialiasingu“ v OpenGL a přístupy pomocí blendingu a accumulation bufferu. Alias vzniká při podvzorkování spojité funkce pod Nyquistův limit (vzorkovací frekvence musí být dvakrát větší než frekvence vzorkované funkce) a projevuje se jako nová, nízkofrekvenční informace, která nebyla v původním signálu přítomna. - prostorový alias – interference rychle se měnícího obrazu s pixelovým rastrem. Zubaté zobrazení šikmých linií. Při kreslení husté sítě čar vzniká tzv. Moiré efekt. Příliš jemná nebo příliš vzdálená pravidelná textura. Příklad:šachovnice ve velké vzdálenosti - časový alias – interference cyklického pohybu se snímkovou frekvencí. Blikání na obvodu pohybujících se objektů. V extrémním případě se celé malé objekty objevují a opět mizí.Příklad:Otáčející se kolo se zdánlivě zastaví nebo se pomalu točíopačně Antialiasing – je metoda, kterou se částečně zbavujeme aliasingu. V OpenGL jsou min. dvě metody: - antialiasing objektů - regular super sampling – pomocí alfa míchání (blending) OpenGL v RGBA módu počítá pokrytí fragmentů. Tato hodnota je uložena jako alfa. 1. umožnění antialiasingu příkazem glEnable(GL_POINT_SMOOTH) nebo GL_LINE_SMOOTH nebo GL_POLYGON_SMOOTH 2. umožnění blendingu příkazem glEnable(GL_BLEND);
3. rendrování (s 3D blendingem) Příklad: glEnable(GL_POLYGON_SMOOTH); //umožnění antialiasingu glEnable(GL_BLEND); //umožnění blendingu glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//míchací fce glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); //nastavení kvality glBegin(GL_TRIANGLES); Přístup pomocí blendingu – při rendrování průhledných ploch musíme vypnout z-buffer. Tím ale ztrácíme informace o hloubce u průhledných objektů. Musíme je proto uspořádat podle hloubky, což může být docela problém, a následně kreslit zepředu dozadu. - antialiasing celých scén - jittered super sampling (roztřesení). 1. Rendrujeme scénu několikrát a na každém pixelu provádíme roztřesení 2. Ukládáme výsledky do akumulačního bufferu 3. Zobrazíme průměr void glAccum(GLenum op, GLfloat value) kde op = jedna z operací GL_ACCUM, GL_LOAD,GL_RETURN, GL_ADD, GL_MULT Přístup pomocí akumulačního bufferu - jednodušší na programování, ale časově náročnější. Používá akumulační buffer a jittering (roztřesení). Tato metoda převádí artefakty vzniklé aliasingem na šum, což je pro lidské oko přirozenější.
37. Co se označuje v OpenGL pod názvem fog? Jak se fog používá a jaké jsou v OpenGL módy pro fog? Uveďte funkce pro práci a příklad použítí. Fog - je obecný termín používaný pro simulování mlhy, kouře, znečištění apod. Je definována jednoduše – intenzita mlhy závisí na vzdálenosti a rovnici mlhy. Použití mlhy příkazem void glFog{if}[v](GLenum name, TYPE val) kde možné kombinace jsou:
Parametry GL_FOG_START a GL_FOG_END mají význam jen v módu GL_LINEAR. Funkce pro práci s mlhou jsou:
glFogi(GL_FOG_MODE,GL_LINEAR)
glFogi(GL_FOG_MODE,GL_EXP) glFogi(GL_FOG_MODE,GL_EXP2) Příklad použití mlhy: GLfloat fogColor[4]={0.5, 0.5, 0.5, 1.0}; glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_EXP); // nastavení módu mlhy glFogfv(GL_FOG_COLOR, fogColor); // nastavení barvy mlhy glFogf(GL_FOG_DENSITY, 0.35); // nastavení hustoty glHint(GL_FOG_HINT, GL_NICEST); // způsob rendrování 38. Popište použití bitmap a s nimi souvisejících příkazů v OpenGL. Nápověda: ??(GLsizei w,Glsizei ,GLfloat x, Lfloat y,GLfloat xx, GLfloat yy,const GLubyte *bitmap) Bitmapa – je matice obsahující jen nuly a jedničky. Bitmapy jsou určeny především pro definici fontů, které by měly být použity společně s display listy. Obrázek (Image) – je matice obsahující pixely Příkazy: - Pozice, na kterou je rendrována mapa, se určuje příkazem: glRasterPos{234}{sifd}[v](TYPE x,TYPE y,TYPE z,TYPE w) Souřadnice jsou transformovány stejně jako vrcholy. - Vrací aktuální pozici v rastru glGetFloatv(GL_CURRENT_RASTER_POSITION, pos) - Říká, jestli byla pozice změněna nebo ne glGetBoolean(GL_CURRENT_RASTER_POSITION_VALID, result) - void glBitmap(GLsizei w,GLsizei h,GLfloat x, GLfloat y,GLfloat xx, GLfloat yy,const GLubyte *bitmap); kde w a h určují šířku a výšku bitmapy x a y je umístění zdroje obrázku (použitého pro fonty) xx a yy je nová pozice glRasterPos*() bitmap = ukazatel na bitmapu
39. Popište použití obrázků v OpenGL a s nimi souvisejících příkazů. Nápověda: ??(GLint x,GLint y,GLsizei w, GLsizei h, GLenum format, GLenum type, GLvoid *data) Obrázek (Image) – je matice obsahující pixely - obrázek je obvykle obdélníková oblast (frame) bufferu - oblasti se mohou číst nebo zapisovat z nebo do z-bufferu a stencil bufferu - obrázky mohou být použity pro texturové mapy - aktuální pozice v rastru je základem pro mnoho operací Příkazy: - Čtení dat ze zadané pozice a o zadané velikosti do datové struktury příkazem: void glReadPixels(GLint x,GLint y,GLsizei w, GLsizei h, GLenum format, GLenum type,GLvoid *dta) - Vykreslení dat na aktuální pozici v rastru se zadanou velikostí příkazem: void glDrawPixels(GLsizei w, GLsizei h, GLenum format, GLenum type, GLvoid *dta) - Kopírování dat ze zadané pozice a o zadané velikosti do aktuální pozice v rastru příkazem void glCopyPixels(GLint x,GLint y,GLsizei w, GLsizei h, GLenum type) kde x a y určují pozici obrázku pro kopírování a čtení w a h určují velikost obrázku format určuje druh pixelových datových elementů GL_RGB, GL_RGBA, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_LUMINANCE - osvětlovací model GL_LUMINANCE_ALPHA – osvětlovací model s alfa složkou GL_STENCIL_INDEX – stencil index GL_DEPTH_COMPONENT – komponenta hloubky type určuje datový typ GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT dta je ukazatel na data Další příkazy pro práci s obrázky: - Zvětšení nebo zmenšení pixelů příkazem void glPixelZoom(GLfloat x, GLfloat y) - Zvětšení nebo zmenšení obrázku příkazem void gluScaleImage(GLenum format, GLint w_in,GLint h_in,GLenum type_in,const void *in,GLint w_out, GLint h_out,GLenum type_out,const void *out) - Nastavení použité interpolace při zvětšování nebo zmenšování glTexParameteri(GL_TEXTURE_2D,w,type) kde type = GL_NEAREST nebo GL_LINEAR w = GL_TEXTURE_MAG_FILTER nebo GL_TEXTURE_MIN_FILTER Během zobrazování se mohou měnit hodnoty R, G, B, A použitím afinních transformací (strojově nezávislé) nebo použitím vyhledávací tabulky (strojově závislé). Afinní transformace: - void glPixelTransfer{if}(GLenum pname,TYPE param) Transformace pomocí vyhledávací tabulky (strojově závislé): - void glPixelMap{ui us f}v(GLenum map,GLint size, constTYPE *array)
40. Co to jsou textury? Jaké známe druhy textur a jakým způsobem se v OpenGL používají? Uveďte mechanizmus OpenGL pro použití textur a podrobně popište specifikaci textury, Nápověda: ??(GLenum target,GLint level,GLint components, GLsizei w, GLsizei h, GLint border, GLenum format, GLenum type, const GLvoid *texels) Textura - je vlastnost povrchu a je simulována obrázky umístěnými na polygonech. Textury mohou být aplikovány na všechna primitiva –body, čáry, polygony, bitmapy, obrázky Textury jsou obdélníková pole dat(texelů)obsahující barvu, jas, alfa složku, normálový vektor Textury mohou být 1, 2 nebo 3 dimenzionální. Proces přiřazení textur je nazýván texturové mapování: 1) Specifikace textury – obrázek nebo mipmapa 2) Určení, jak bude textura aplikována – blending, modulace, scale 3) Umožnění mapování textur příkazem glEnable(GL_TEXTURE_1D) _2D _3D Pokud je definováno více textur, je vybrána ta s vyšší dimenzí. 4) Vykreslení scény se zadanými texturovacími souřadnicemi pro každý vrchol Specifikace textury: - void glTexImage2D(GLenum target,GLint level,GLint components, GLsizei w, GLsizei h, GLint border,GLenum format, GLenum type, const GLvoid *texels) kde target = GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D level = číslo určující úroveň detailů 0~jednoduchá textura components použito pro modulaci a blending. 1~red, 2~red+alpha, 3~RGB, 4~RGBA w, h určují rozsah textury border = šířka okraje format = GL_COLOR_RGB, _RGBA, _RED, _GREEN, _BLUE,_ALPHA, _LUMIANCE, _LUMIANCE_ALPHA type určuje datový typ - GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT texels = pole dat Texturu lze také vytvořit přečtením vykresleného obrázku přímo z frame bufferu příkazem glCopyTexImage2D(). 41. Co jsou to souřadnice textury? Uveďte funkce OpenGL a příklad použití. Každá textura je přiřazena objektu a může být transformována společně s objektem – rotace,.. Nastavení módu texturování objektů příkazem glMatrixMode(GL_TEXTURE) Každý vrchol má přiřazeny souřadnice textury – tím se určuje, který texel je přiřazen vrcholu. Souřadnice textury jsou mezi vrcholy lineárně interpolovány. void glTexCoord{1234}{sifd}[v](TYPE coords) – určuje souřadnice textury pro daný vrchol Souřadnice textury se označují s, t, r, q.
Příklad: glBegin(GL_QUADS); glTexCoord2f(0.1, 0.1); glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(0.0, 0.9); glVertex3f(-2.0, 1.0, 0.0); glTexCoord2f(1.1, 0.8); glVertex3f(0.0, 1.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0); glEnd(); 42. K čemu slouží „Repeating“ a „Clamping“? Jak se v OpenGL používá? Uveďte funkce OpenGL a příklady použití. Textury jsou definovány v rozsahu [0,1]. Repeating a Clamping slouží k nastavení mapování textur při překročení tohoto rozsahu. Repeating nastavuje opakování textury pomocí parametru GL_CLAMP a Clamping provádí roztažení textury pomocí parametru GL_REPEAT. Způsob, jakým je textura mapována na povrch vykreslovaného tělesa lze nastavit příkazem void glTexParameter{if}[v](GLenum target, GLenum name,TYPE param) kde target = GL_TEXTURE_2D, _1D or _3D name = GL_TEXTURE_WRAP_S – opakování nebo protažení ve směru osy s GL_TEXTURE_WRAP_T - opakování nebo protažení ve směru osy t GL_TEXTURE_WRAP_R - opakování nebo protažení ve směru osy r GL_TEXTURE_BORDER_COLOR – nastavení barvy rámečku textury param = pro GL_TEXTURE_WRAP_S, _T, _R GL_CLAMP - roztažení, GL_REPEAT - opakování pro GL_TEXTURE_BORDER_COLOR color – barva rámečku okolo textury, pokud má rámeček nenulovou šířku
Opakování a roztažení může být kombinováno – viz. 2 příklad: 1. glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); 2. glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); 43. K čemu slouží filtrování textur? Jak se v OpenGL používá? Uveďte funkce OpenGL a příklady použití. Při zmenšování a zvětšování textur máme dvě možnosti – použít vzorkování pomocí
nejbližšího souseda (rychlejší) nebo lineární interpolaci (pěknější). Způsob, jakým je textura mapována na povrch vykreslovaného tělesa lze nastavit příkazem void glTexParameter{if}[v](GLenum target, GLenum name,TYPE param) kde target = GL_TEXTURE_2D, _1D or _3D name = GL_TEXTURE_MIN_FILTER – filtr použitý při zmenšování textury GL_TEXTURE_MAG_FILTER – filtr použitý při zvětšování textury param = pro GL_TEXTURE_MAG_FILTER GL_NEAREST – je použita interpolace pomocí nejbližšího souseda GL_LINEAR – je použita lineární interpolace pro GL_TEXTURE_MIN_FILTER GL_NEAREST – je použita interpolace pomocí nejbližšího souseda GL_LINEAR – je použita lineární interpolace GL_NEAREST_MIPMAP_NEAREST – mipmaping s interpolací sousedem mezi různými úrovněmi mipmapy a s interpolací sousedem mezi texely GL_NEAREST_MIPMAP_LINEAR – mipmaping s interpolací sousedem mezi různými úrovněmi mipmapy a s lineární interpolací mezi texely GL_LINEAR_MIPMAP_NEAREST – mipmaping s lineární interpolací mezi různými úrovněmi mipmapy a s interpolací sousedem mezi texely GL_LINEAR_MIPMAP_LINEAR – mipmaping s lineární interpolací mezi různými úrovněmi mipmapy a s lineární interpolací mezi texely
Příklad použití: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 44. K čemu slouží Mip Maps? Jak se v OpenGL používá? Uveďte funkce OpenGL a příklady použití. Nápověda: ??(GLenum target,GLint level,GLint components, GLsizei w, GLsizei h, GLint border, GLenum format, GLenum type, const GLvoid *texels) Mip mapping – je technika LOD (Level Of Detail). OpenGL automaticky vybere dvě úrovně mipmapy (podle vzdálenosti objektu od pozorovatele) mezi kterými provede interpolaci. Tím se odstraní alias. Mipmapy jsou textury v rozlišeních 2mx2n, 2m/2x2n/2, 2m/4x2n/4,…,1 pixel, které musíme vytvořit a uložit pomocí příkazu glTexImage2D(), ve kterém parametr level určuje úroveň detailů LOD.
- void glTexImage2D(GLenum target,GLint level,GLint components, GLsizei w, GLsizei h, GLint border,GLenum format, GLenum type, const GLvoid *texels) kde target = GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D level = číslo určující úroveň detailů 0~jednoduchá textura components použito pro modulaci a blending. 1~red, 2~red+alpha, 3~RGB, 4~RGBA w, h určují rozsah textury border = šířka okraje format = GL_COLOR_RGB, _RGBA, _RED, _GREEN, _BLUE,_ALPHA, _LUMIANCE, _LUMIANCE_ALPHA type určuje datový typ - GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT texels = pole dat Způsob, jakým je textura mapována na povrch vykreslovaného tělesa lze nastavit příkazem void glTexParameter{if}[v](GLenum target, GLenum name,TYPE param) kde target = GL_TEXTURE_2D, _1D or _3D name = GL_TEXTURE_MIN_FILTER – filtr použitý při zmenšování textury GL_TEXTURE_MAG_FILTER – filtr použitý při zvětšování textury param = pro GL_TEXTURE_MAG_FILTER GL_NEAREST – je použita interpolace pomocí nejbližšího souseda GL_LINEAR – je použita lineární interpolace pro GL_TEXTURE_MIN_FILTER GL_NEAREST – je použita interpolace pomocí nejbližšího souseda GL_LINEAR – je použita lineární interpolace GL_NEAREST_MIPMAP_NEAREST – mipmaping s interpolací sousedem mezi různými úrovněmi mipmapy a s interpolací sousedem mezi texely GL_NEAREST_MIPMAP_LINEAR – mipmaping s interpolací sousedem mezi různými úrovněmi mipmapy a s lineární interpolací mezi texely GL_LINEAR_MIPMAP_NEAREST – mipmaping s lineární interpolací mezi různými úrovněmi mipmapy a s interpolací sousedem mezi texely GL_LINEAR_MIPMAP_LINEAR – mipmaping s lineární interpolací mezi různými úrovněmi mipmapy a s lineární interpolací mezi texely
Příklad použití mipmapingu: glTexImage2D(GL_TEXTURE_2D,0,3,32,32,0,GL_RGB,GL_UNSIGNED_BYTE,&image32[0 ][0][0]);//32x32 glTexImage2D(GL_TEXTURE_2D,1,3,16,16,0,GL_RGB,GL_UNSIGNED_BYTE,&image16[0 ][0][0]);//16x16
glTexImage2D(GL_TEXTURE_2D,2,3,8,8,0,GL_RGB,GL_UNSIGNED_BYTE,image8[0][0][0 ]);//8x8 glTexImage2D(GL_TEXTURE_2D,3,3,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,&image4[0][0] [0]); //4x4 glTexImage2D(GL_TEXTURE_2D,4,3,2,2,0,GL_RGB,GL_UNSIGNED_BYTE,&image2[0][0] [0]); //2x2 glTexImage2D(GL_TEXTURE_2D,5,3,1,1,0,GL_RGB,GL_UNSIGNED_BYTE,&image1[0][0] [0]); //1pixel glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP _NEAREST); 45. Popište automatické souřadnice textur v OpenGL. K čemu slouží a jak se používají? Nápověda: ??(GLenum coord,GLenum pname,TYPE p) Souřadnice textur nemusíme uvádět u každého vrcholu, ale mohou být také generovány automaticky. Možnosti jsou: - použití lineárního mapování parametrem GL_OBJECT_LINEAR - použití pohledově závislého lineárního mapování parametrem GL_EYE_LINEAR - použití mapování okolního prostředí na zobrazované těleso (environment mapping) parametrem GL_SPHERE_MAP Příkaz, který zapíná automatické generování souřadnic: void glTexGen{ifd}[v](GLenum coord,GLenum pname,TYPE p) kde coord = GL_S, GL_T, GL_R, nebo GL_Q pname = GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, GL_EYE_PLANE pro GL_TEXTURE_GEN_MODE p = GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP pro GL_OBJECT_PLANE, GL_EYE_PLANE p = (GLfloat,GLfloat,GLfloat,GLfloat)
Příklad mapování prostředí na kouli:
glTexGenfv(GL_S, GL_SPHERE_MAP,0); glTexGenfv(GL_T, GL_SPHERE_MAP,0); glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T); 46. Popište texturové objekty v OpenGL, způsob generování, funkce a použití. Texturové objekty v OpenGL ukládají data a umožňují jejich čtení. Použití texturových objektů je obvykle nejrychlejší cestou k aplikování textur. - Pojmenování texturových objektů příkazem void glGenTextures(GLsizei n, GLuint *textureNames); // vytvoření jmen textur kde n = počet textur v poli textureNames textureNames = pole jmen textur - Ověření, jestli existuje texturový objekt se zadaným jménem příkazem GLboolean glIsTexture(GLuint textureName); vrací GL_TRUE jestliže textureName je jméno textury, která je dostupná - Vytvoření texturového objektu příkazem void glBindTexture(GLenum target, GLuint TextureName); // vytvoření textury kde target = GL_TEXTURE_1D, _2D, nebo_3D Příklad: glGenTextures(2, texName); glBindTexture(GL_TEXTURE_2D, texName[0]); glBindTexture(GL_TEXTURE_2D, texName[1]); void display(void) { glBindTexture(GL_TEXTURE_2D, texName[0]); renderObject(); }
47. Co to je Frame Buffer? Z čeho se skládá? Popište obecný způsob mazání bufferů v OpenGL. Framebuffer – je buffer, do kterého se ukládají fragmenty. Fragmenty jsou pixely s informacemi o hloubce a dalšími informacemi. Framebuffer se skládá z následujících bufferů: - buffery pro uložení barev fragmentů (color buffers) – dva buffery pro double-buffering (přední a zadní) a dva buffery pro stereoprojekci (pro levé a pravé oko). Musí být vytvořen alespoň jeden barvový buffer. - paměť hloubky fragmentů (depth buffer, z-buffer) – v tomto bufferu jsou uloženy informace o hloubce fragmentů, tj. vzdálenost fragmentů od projekční roviny. - paměť pro šablonu (stencil buffer) – slouží k maskování fragmentů, tj. určuje, které se mají z vykreslovacího řetězce vyloučit - akumulační buffer (accumulation buffer) – používá se pro sloučení více scén nebo více pohledů na jednu scénu do výsledného obrazu. V tomto bufferu jsou uloženy barevné složky fragmentů, většínou ve formátu RGBA.
Příkazy pro mazání jednotlivých bufferů jsou: void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha); void glClearIndex(GLfloat index); void glClearDepth(GLclampd depth); void glClearStencil(Glint s); void glClearAccum(GLfloat red,Glfloat green, Glfloat blue, Glfloat alpha); Nebo příkaz void glClear(GLbitfield mask); kde mask = GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT, GL_ACCUM_BUFFER_BIT 48. Popište, jak se v OpenGL vybírá „Color buffer“ pro zápis a jak se do něj zapisuje. Jaké existují druhy „Color buffers“ a k čemu slouží? Buffery pro uložení barev fragmentů (color buffers): - normální zobrazení – jeden buffer nebo dva buffery pro double-buffering (přední a zadní) - stereoskopické zobrazení - dva buffery pro stereoprojekci (pro levé a pravé oko) – levý a pravý, a pokud je umožněn double-buffering, jsou potřebné následující buffery – levý přední, levy zadní, pravý přední a pravý zadní. Musí být vytvořen alespoň jeden barvový buffer. Současně lze zapisovat do více barvových bufferů. - umožnění zápisu příkazem void glDrawBuffer(GLenum mode); kde mode = GL_FRONT, GL_FRONT_LEFT, GL_FRONT_RIGHT , GL_BACK, GL_BACK_LEFT, GL_BACK_RIGHT, GL_LEFT, GL_RIGHT, GL_NONE, GL_FRONT_AND_BACK, GL_AUXi - umožnění čtení příkazem void glReadBuffer(GLenum mode); kde mode = stejné ale bez GL_FRONT_AND_RIGHT a GL_NONE Stereoprojekci je třeba inicializovat příkazem glutInitDisplayMode() s příznaky GLUT_STEREO a GLUT_DOUBLE. 49. Jakým způsobem se pracuje se „Stencil bufferem“ a k čemu tento buffer slouží? Uveďte funkce OpenGL pro stencilový test a příklady použití stencilového bufferu. Paměť pro šablonu (stencil buffer) – slouží k maskování vytvářených fragmentů, tj. určuje, které fragmenty se mají z vykreslovacího řetězce vyloučit. Paměť šablony nachází své uplatnění při vytváření stínů, zrcadlení, těles pomocí CSG nebo simulace stereopohledů bez alokace stereo barvových bufferů. Jak pracuje stencil buffer: Stencil test (test na šablonu) se provádí pro každý vykreslovaný fragment tak, že se porovnává hodnota ve stencil bufferu se zadanou referenční hodnotou. V závislosti na výsledku testu může být hodnota ve stencil bufferu změněna
- pro vytvoření paměti šablony ve framebufferu je zapotřebí při inicializaci volat funkci glutInitDisplayMode() s nastaveným bitovým příznakem GLUT_STENCIL a umožnit stencil test příkazem glEnable(GL_STENCIL_TEST); - nastavení stencil testu pomocí příkazu void glStencilFunc(GLenum func, Glclampf ref,Gluint mask); defaultní nastavení: func = GL_ALWAYS // fragment projde vždy do dalšího zpracování ref = 0, mask = 1 - co se má stát s hodnotou ve stencil bufferu v případě,že: fail – test na šablonu fragment odmítne z dalšího zpracování zfail – test na hloubku fragmentu bude neúspěšný zpass – test na hloubku fragmentu bude úspěšný určuje příkaz void glStencilOp(GLenum fail, Glenum zfail,Glenum zpass); kde fail, zfail, zpass = GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR defaultní nastavení: GL_KEEP, GL_KEEP, GL_KEEP (KEEP - ponechat původní hodnotu) Příklad použití stencilového bufferu: void init(void){ …, glClearStencil(0x0); glEnable(GL_STENCIL_TEST); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glStencilFunc(glEqual, 0x1, 0x1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glutSolidSphere(0.5, 15, 15); glStencilFunc(... } 50. Jakým způsobem se pracuje s „Accumulation Bufferem“ a k čemu tento buffer slouží? Uveďte funkce OpenGL pro použití accumulation bufferu a příklady použití accumulation bufferu. Akumulační buffer (accumulation buffer) – slouží ke sloučení více scén nebo více pohledů na jednu scénu do výsledného obrazu. V tomto bufferu jsou uloženy barevné složky fragmentů, většinou ve formátu RGBA. Příklady použití akumulačního bufferu: - na antialiasing scény – princip antialiasingu: 1. rendrování scény několikrát a roztřesení všech pixelů (jittering) 2. sečtené výsledky se uloží do akumulačního bufferu 3. zobrazí se průměr - motion blur - vykreslování těles, které jsou rozmazány pohybem nebo rozmazání příliš blízkých nebo naopak vzdálených těles - simulace hloubky ve fotografii - výpočet měkkých stínů Příkazy: - pro vytvoření akumulačního bufferu je zapotřebí při inicializaci volat funkci glutInitDisplayMode() s nastaveným bitovým příznakem GLUT_ACCUM
- nastavení akumulačního bufferu příkazem void glAccum(GLenum op, GLfloat value) kde op = GL_ACCUM, GL_LOAD,GL_RETURN, GL_ADD, GL_MULT // operace GL_ACCUM – čte z rendrovacího bufferu, násobí každou RGBA složku hodnotou value a přidává výsledek do akumulačního bufferu GL_LOAD – dělá to samé, ale hodnoty jsou vyměněny GL_RETURN – bere hodnoty z akumulačního bufferu, násobí je hodnotou value a hodnotu vrací zpět do rendrovacího bufferu GL_MULT – přidává nebo násobí hodnotu každého pixelu v akumulačním bufferu GL_ADD – a vrací ji zde. Násobení je převedeno do rozsahu [-1,1]