funkce deckles
Transkript
Zobrazovací řetězec a obrazová paměť, operace s fragmenty Petr Felkel Katedra počítačové grafiky a interakce, ČVUT FEL místnost KN:E-413 na Karlově náměstí E-mail: [email protected] S použitím materiálů Bohuslava Hudce, Jaroslava Sloupa a úprav Vlastimila Havrana Poslední změna: 16.2.2015 Zobrazovací řetězec – tok dat (data flow) Obrázek převzat od Davida Ambrože PGR 2 Od vrcholu k fragmentu Obrázek převzat od Davida Ambrože PGR 3 Od vrcholu k fragmentu Po průchodu vertex shaderem vstupují vrcholy do fixní části zobrazovacího řetězce • • • • • sestavení primitiva (primitive assembly) ořezání do pohledového jehlanu (clipping) převod z homogenních souřadnic (Divide-by-W) umístění na obrazovku (Viewport) Rasterizace a interpolace (Rasterizer) Pak následuje fragment shader • • PGR V něm se spočítá výsledná barva fragmentu Fragment jsou všechna data adresovaná souřadnicemi jednoho konkrétního pixelu, viz dále. 5 Od vrcholu k fragmentu [Gortler] PGR 6 Ořezání (clipping) Ořezání odstraní geometrii mimo pohledový jehlan (viewing frustrum) - top, bottom, left, right, near, far Šetří se tím rasterizace a výpočty (nepočítá se to, co není vidět) Vznikají nové vrcholy [www.willamette.edu] Odstraní se části primitiv za kamerou PGR [http://techpubs.sgi.com] 7 Odstranění části primitiv za kamerou Trojúhelník z boku Vrchol za kamerou chybně správně Vykreslujeme totiž fragmenty mezi průměty koncových bodů • Dělení překlopí oba vrcholy do stejné průmětny správně po ořezání PGR 8 Ve kterých souřadnicích ořezávat? V souřadnicích kamery? => Ne, ještě neproběhla projekce. V normalizovaných souřadnicích? => Ne, již došlo k překlopení (proběhlo dělení ) V ořezových souřadnicích (clip-space) => ANO – ještě nedošlo k dělení , trojúhelník je ve 4D Pozice i atributy nových vrcholů se počítají v ořezových souřadnicích – a lineárně interpolují z původních vrcholuů PGR 9 Eliminace odvrácených (Backface culling) U uzavřených těles (watertight) nikdy nevidíme odvrácenou stěnu Vrcholy zadáváme proti směru hodinových ručiček (ccw) Pak stačí vyřadit plošky s odvrácenou normálou [flylib.com] back face = if( . front PGR ) back 10 Viewport Matice transformace záběru (pracoviště) …viz předn. 05 2 1 0 0 0 0 0 2 0 0 0 1 2 0 1 2 1 Normalizované souřadnice zařízení [xd yd zd ]t 2 2 1 Souřadnice formátu na obrazovce [xw yw zw ]t 1 w 1 -1 -1 PGR -1 1 o viewport y x y screen 1 h 0 11 Pixel coordinates levý dolní roh okna y–ová souřadnice okna 3.0 Souřadnice pixelu = souřadnice jeho levého dolního rohu - pixel (x, y) pokrývá plochu mezi x,y a x+1, y+1 2.0 region occupied by a pixel (2, 1) 1.0 0.0 0.0 1.0 2.0 3.0 X-ová souřadnice okna PGR 12 Rasterizace PGR 13 Zobrazovací řetězec – tok dat (data flow) Obrázek převzat od Davida Ambrože PGR 14 Obrazová paměť – framebuffer dříve ≤ 3.3 Součásti (vrstvy, roviny) obrazové paměti akumulační (accum.) šablona (stencil) hloubka (depth) barva (AUXi) barva (BACK-LEFT) barva (FRONT-LEFT) minimum barva (BACK-RIGHT) barva (FRONT-RIGHT) Pixel v různých rovinách obrazové paměti PGR 15 Obrazová paměť – framebuffer nyní ≥ 4.0 Součásti (vrstvy, roviny) obrazové paměti minimum šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) barva (BACK-RIGHT) barva (FRONT-RIGHT) Pixel v různých rovinách obrazové paměti PGR 16 Paměť barvy - color buffer (1) Barva RGB(A) Kreslí se do ní neviditelné viditelné šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) barva (BACK-RIGHT) barva (FRONT-RIGHT) Pixel v různých rovinách obrazové paměti PGR 17 Paměť barvy - color buffer (2) Minimální konfigurace OpenGL - FRONT_LEFT šablona (stencil) hloubka (depth) barva (BACK-LEFT) Stereo, double buffer - podporován? barva (FRONT-LEFT) barva (BACK-RIGHT) barva (FRONT-RIGHT) glGetBooleanv( GL_STEREO, &b ); glGetBooleanv( GL_DOUBLEBUFFER, &b ); Výběr, kam se kreslí barva fragmentů glDrawBuffer( GLenum mode ); // … jedna paměť • GL_NONE, … „nekreslí se“ nic • GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT, … jedna paměť glDrawBuffers(GLsizei n, const GLenum * bufs); // n – pamětí – multiple rendering targets • GL_COLOR_ATTACHMENTn … pro FBO (framebuffer object) PGR 18 Paměť barvy - color buffer (3) Barva v BACK bufferu • • • barva (BACK-RIGHT) barva (FRONT-RIGHT) Kreslí se do ní na pozadí (není vidět) Přepíná se s FRONT bufferem – glutSwapBuffers () Mono: glDrawBuffer(GL_BACK_LEFT); // GL_BACK Stereo: glDrawBuffer(GL_BACK_LEFT); cameraL();draw(); glDrawBuffer(GL_BACK_RIGHT);cameraR();draw(); Výběr zdroje pro čtení glCopyPixels() • PGR barva (FRONT-LEFT) Výběr roviny na kreslení • • RGB(A), šablona (stencil) hloubka (depth) barva (BACK-LEFT) glReadBuffer(GL_BACK_LEFT); 19 Paměť hloubky – depth buffer (1) akumulační(accum.) Hloubka (depth-, Z-buffer) • • vzdálenost oko-pixel typické použití: viditelnost šablona (stencil) hloubka (depth) barva (AUXi) barva (BACK-LEFT) barva (FRONT-LEFT) (vzdálenější pixel je přepsán bližším) Blízká tělesa zakrývají vzdálená tělesa Bližší fragmenty překreslí ty vzdálenější Fragmenty, které jsou dále se zahodí (stejně by nebyly vidět) Lze řešit viditelnost bez paměti hloubky? [ from Wikipedia ] PGR 20 Paměť hloubky – depth buffer (2) Hloubka (depth) šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) barva (BACK-RIGHT) barva (FRONT-RIGHT) Nastavení v programu při výběru kontextu glutInitDisplayMode(… | GLUT_DEPTH | …); glEnable( GL_DEPTH_TEST ); // zapnutí hloubkového testu glDepthMask( GL_TRUE ); // povolení aktualizace Použití – viz dále glClear( ….| GL_DEPTH_BUFFER_BIT | … ); // smazání DrawObjectsInTheScene(); … PGR 21 Pamět hloubky – depth buffer (3) void glDepthFunc( GLenum func ) func – funkce pro porovnávání (novéZ fragmentu s uloženouZ pixelu) GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, a GL_ALWAYS void glEnable( GL_DEPTH_TEST ); // zapnutí hloubkového testu void glDepthMask( GLboolean flag ) flag - význam // povolení aktualizace paměti // hloubky GL_FALSE – zápis zakázán GL_TRUE – zápis povolen void glDepthRange( GLclampd zNear, GLclampd zFar ) transformace do z-ových souřadnic okna normalizované souřadnice z -1, 1 => zokna 0, 1 - rozsah jako barva zNear => 0, zFar => 1 !!! PGR 22 Šablona - stencil Se šablonou bez šablony [Sulaco] [O Reilly] PGR 23 Šablona - stencil Šablona (stencil) • • • • • lze označit pixely, kam se smí / nesmí kreslit šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) barva (BACK-RIGH barva (FRONT-RIGHT jedna či více bitových rovin (bitplane) pomocí masky se zvolí bitová rovina přímo se nekreslí (dle paměti barvy) používá se ve víceprůchodových algoritmech pro speciální efekty: obtisky (decals), získání obrysu (outlining), odrazy (v zrcadle, ve vodě), a zobrazování CSG modelů (constructive solid geometry). PGR 24 Zobrazovací řetězec – tok dat (data flow) Obrázek převzat od Davida Ambrože PGR 25 Počet bitových rovin - bitplanes Color buffer: [r,g,b,a] = [8, 8, 8, 8] bits Depth buffer: depth = 24 bits Stencil buffer: 8 bits Auxiliary color buffers: 4 Double buffer: supported Stereo: not supported Inicializace v GLUTu glutInitDisplayMode( | | | ); PGR GLUT_RGB GLUT_DEPTH GLUT_STENCIL GLUT_DOUBLE // // // // only RGB, no alpha depth buffer stencil buffer double buffer(front + back) 26 Mazání pamětí (buffers) pro vykreslování Smazání vybraných pamětí void glClear( GLbitfield mask ); mask – které paměti smazat • • • PGR GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT, 27 Mazání pamětí Nastavení „mazací“ hodnoty pro jednotlivé roviny void glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); void glClearDepth( GLclampd h ); void glClearStencil( GLint s ); Hloubka h je z intervalu <0,1>. Implicitní hodnota h = 1.0 ~ zFar Ostatní parametry mají implicitní hodnotu 0, resp 0.0f. PGR 28 Maskování zápisu do obrazové paměti Do paměti se zapíše, jen pokud je to povoleno maskou Nastavení masky (true zapisuje, false ne) void glColorMask( GLboolean GLboolean GLboolean GLboolean red, green, blue, alpha ); void glDepthMask( GLboolean flag ); void glStencilMask( GLuint mask ); Implicitně všechny na GL_TRUE a GLuint na samé jedničky PGR 29 Zobrazovací řetězec – tok dat (data flow) Obrázek převzat od Davida Ambrože PGR 30 Testování fragmentů Po rasterizaci víme, které fragmenty vznikly, jakou mají barvu, hloubku, případně i další informace - normálu, vektor ke světlu,… (fragmenty = možné budoucí pixely s hloubkou, barvou,…) Fragment musí projít ještě řadu testů a operací …. na konci je obrazová paměť (color, depth, stencil) Test – povolí či zakáže daný fragment – může změnit hodnotu příslušné paměti test hloubky = aktualizuje hloubku pixelu test šablony = změní hodnotu v šabloně PGR 31 Testování fragmentů a operace s fragmenty Enable/Disable Scissor test šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) PGR barva (BACK-RIGHT) barva (FRONT-RIGHT) 32 Testování fragmentů a operace s fragmenty 1. Výstřižek (Scissor test) 2. Test šablony (Stencil test) 3 testy 3. Test hloubky (Depth test) 4. Míchání (Blending) 5. Logické operace PGR 2 operace 33 1. test: Výstřižek (scissor test) (1) Enable/Disable Scissor test šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) PGR barva (BACK-RIGHT) barva (FRONT-RIGHT) 34 1. test: Výstřižek (scissor test) (2) Kreslení pouze do obdélníkové oblasti okna rychlá verze šablony (stencil) Update changed part of the screen only void glScissor( GLint x, GLint y, y h w GLsizei w, GLsizei h ) x, y dolní levý roh x w, h šířka a výška glEnable( GL_SCISSOR ); PGR 35 3. test – Hloubkový test (depth test) (1) Enable/Disable Scissor test šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) PGR barva (BACK-RIGHT) barva (FRONT-RIGHT) 36 3. test – Hloubkový test (depth test) (2) Pro každý pixel uložena vzdálenost k oku if( depth_test_passes ) propusť pixel a nahraď hloubku novou hodnotou Režimy paměti hloubky (zBuffer) Test vypnut glDisable( GL_DEPTH_TEST ); Test zapnut glEnable( GL_DEPTH_TEST ); PGR • • povolena aktualizace zBufferu glDepthMask( GL_TRUE ); zakázána aktualizace zBufferu glDepthMask( GL_FALSE ); 37 3. test – Hloubkový test (depth test) (3) Pro každý pixel uložena vzdálenost k oku (ke kameře) if( depth_test_passes ) { // depth < stored_depth propusť fragment if( DEPTH_MASK true ) nahraď novou hodnotou z //update stored_depth=dep } else { // depth test failed if( DEPTH_TEST enabled ) zadrž fragment else propusť fragment neměň uloženou hodnotu Z } PGR 38 2. test: Šablona (stencil test) (1) Enable/Disable Scissor test šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) PGR barva (BACK-RIGHT) barva (FRONT-RIGHT) 39 2. test: Šablona (stencil test) (2) Stencil test • Porovná referenční hodnotu ref s hodnotou pixelu v šabloně s Podle výsledku porovnání (true / false) • propustí či nepropustí fragment - glStencilFunc() a modifikuje obsah šablony - glStencilOp() porovnává jen bity které mají 1 v masce mask - glStencilMask() Modifikace závisí i na testu hloubky (depth test) Tři různé kombinace -> tři modifikující operace fail porovnání neuspělo zfail porovnání uspělo, neuspěl test hloubky (vzadu, zakryto) zpass porovnání uspělo, uspěl test hloubky (nebo je zakázán) (vpředu) • glEnable(GL_STENCIL_TEST) • glStencilMask(GLuint mask) PGR Povolí test i modifikaci šablony Maskování jen některých bitů 40 2. test: Šablona (stencil test) (3) Funkcionalita nad fragmenty je následující: fragment Stencil test sfail Nastavena funkcí: glStencilFunc(GLenum func, GLint ref, GLuint mask) Depth test (z-test) zfail zpass Aktualizace stencil bufferu dána funkcí: glStencilOp(sfail, zfail, zpass) PGR 41 2. test: Šablona (stencil test) (4) void glStencilFunc( GLenum func, GLint ref, GLuint mask ) Nastavuje porovnávání • porovnávací funkci func • • GL_NEVER, GL_LESS, GL_LEQUAL, GL_GREATER, GL_GEQUAL, GL_EQUAL, GL_NOTEQUAL a GL_ALWAYS např.: GL_LESS => if( ref < pixelStencilValue ) then true referenční hodnotu ref (default 0) = konstanta S ní se porovnává, nebo se zapíše do masky masku mask (samé 1) dolních s bitů odpovídá s bitům šablony bitový AND (&) určí bitové roviny k porovnání např.: GL_LESS => if( ref & mask) < ( stencil & mask) then true přesněji Porovnávácí funkce GL_LESS, GL_GREATER atd. PGR 42 2. test: Šablona (stencil test) (5) void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) Nastavuje modifikující operace pro hodnoty ve stencil buffer • • funkce modifikující data ve stencil bufferu fail porovnání neuspělo zfail porovnání uspělo, neuspěl test hloubky zpass porovnání uspělo, uspěl test hloubky (nebo je zakázán) GL_KEEP (nemění šablonu) GL_ZERO (nastaví na 0) GL_REPLACE (nastaví na ref zadané glStencilFunc) GL_INCR, GL_INCR_WRAP (inkrementace šablony ) GL_DECR, GL_DECR_WRAP (dekrementace šablony ) GL_INVERT (inverze bitů) PGR 43 2. test: Šablona (stencil test) (6) Příklad kreslení vymezené trojúhelníkem Červený trojúhelník se nakreslí a přitom naplní šablonu 1 Pak se kreslí zelený čtverec pouze tam, kde je v šabloně 1 (zbyde z něj jen zelená část bez rohů) Pak se kreslí modrý čtverec pouze tam, kde je v šabloně 0 (zbydou z něj jen modré rohy) glStencilFunc(GL_ALWAYS, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); drawRedTriangle(); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); drawGreenPolygon(); glStencilFunc(GL_NOTEQUAL, 1, 1); drawBluePolygon(); PGR 44 2. test: Šablona (stencil test) Příklad – kreslení kosočtverce do a mimo něj 1. inicializovat (7) hodnota 1 pro replace rovina č. 1 (maska) glClearStencil(0x0); glEnable(GL_STENCIL_TEST); 2. naplnit šablonu jedničkami (kosočtverec na obrázku) • • vynulovat glClear(GL_STENCIL_BUFFER_BIT); nastavit glStencilFunc (GL_ALWAYS, 0x1, 0x1) glStencilOp(…,GL_REPLACE,GL_REPLACE); • nakreslit tvar 3. Kreslit scénu drawStencil(); // kosočtverec, tvar šablony glStencilOp(GL_KEEP, GL_KEEP,GL_KEEP); glStencilFunc(GL_EQUAL, 0x1, 0x1); // 1 drawBlueSphere() // uvnitř šablony glStencilFunc(GL_NOTEQUAL, 0x1, 0x1); // 0 drawToriScene(); // mimo šablonu PGR PGR glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) 45 2. test: Šablona (stencil test) (8) Vyplnění děr v uzavřených tělesech po oříznutí rovinou („uzavření tělesa“, aby nebylo vidět dovnitř) musí mít sudý počet přivrácených a odvrácených stěn -> XOR • vynulovat šablonu glClearStencil(0x0); glClear(GL_STENCIL_BUFFER_BIT); • povolit update, invertovat (jednou 1, 2x bude 0,…) glEnable(GL_STENCIL_TEST); glStencilFunc (GL_ALWAYS, …, 0x1); glStencilOp (…, GL_INVERT, GL_INVERT); • dokreslit „čepice“ (všechny najednou) glStencilFunc (GL_NOTEQUAL, 0x0, 0x1); glStencilOp( GL_KEEP, GL_KEEP,GL_KEEP); drawLargeRectangleCap(); PGR glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) 46 4. operace: Míchání barev (blending) (1) Enable/Disable Scissor test šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) PGR barva (BACK-RIGHT) barva (FRONT-RIGHT) 47 4. operace: Míchání barev (blending) (2) míchání nové barvy s barvou v obrazové paměti v režimu RGBA viz následující přednáška PGR 48 5. Logické operace (1) Enable/Disable Scissor test šablona (stencil) hloubka (depth) barva (BACK-LEFT) barva (FRONT-LEFT) PGR barva (BACK-RIGHT) barva (FRONT-RIGHT) 49 5. Logické operace Logické operace (2) Zdroj S f (S,D) D Zdroj S - bit fragmentu Cíl D - bit pixelu barevné paměti (color buffer) Hodnoty cíle a zdroje 0 a 1 Cíl f(z,d) má 16 možných kombinací 16 módů zápisu Výběr logické operace (módu zápisu) void glLogicOp(GLenum mód) Povolení / zákaz aplikace logické operace glEnable(GL_LOGIC_OP) glDisable(GL_LOGIC_OP); PGR 50 5. Logické operace (3) Logické operace mezi barvou RGBA fragmentu a barvou uloženou v barevné paměti (colorBuferu) 16 operací (módů) S = source, D = destination 0 1 2 3 4 5 6 7 PGR operationCode GL_CLEAR GL_COPY GL_NOOP GL_SET GL_COPY_INVERT GL_INVERT GL_AND_REVERSE GL_OR_REVERSE meaning 0 S D 1 S D SD SD 8 9 10 11 12 13 14 15 operationCode meaning Gl_AND SD GL_OR SD GL_NAND (S D) GL_NOR (S D) GL_XOR S xor D GL_EQUIV ( S xor D) GL_AND_INNVERTED SD GL_OR_INVERTED SD 51 Shrnutí Zobrazovací řetězec • Součásti obrazové paměti • • na co se používají jak se mažou a jak se do nich zapisuje Testy a operace s fragmenty • • • PGR Část od sestavení primitiv po rasterizaci provádí se po výpočtu pozice a barvy fragmentu určí, jestli se fragment dostane na obrazovku šablona, test hloubky, … 52 Zobrazovací řetězec – dnes probrané části Obrázek převzat od Davida Ambrože PGR 53
Podobné dokumenty
Třinec - HC Motor
Třinec v pouhých pěti zápasech stvrdil svou suverenitu v ročníku, který se
do dějin mimo třineckého triumfu zapíše
i eskapádami s chybnými registracemi
hráčů ve třech ze čtrnácti klubů nejvyšší
sou...
Vstupní operace, identifikace a výběr zobrazovaných objektů
Vstupní operace, identifikace
a výběr zobrazovaných objektů
Petr Felkel
Katedra počítačové grafiky a interakce, ČVUT FEL
místnost KN:E-413 na Karlově náměstí
E-mail: [email protected]
S použitím m...
3.0 MB - NeHe OpenGL Tutoriály
Na podobný tutoriál jste už jistě netrpělivě čekali. Naučíte se základy o detekcích kolizí, jak na ně reagovat a na fyzice
založené modelovací efekty (nárazy, působení gravitace ap.). Tutoriál se v...
Bakalářská práce
Vizuálním doprovodem k hudbě je myšlen obraz měnící se v čase, který je promítán na plátno na
vystoupeních kapel a dýdžejů. Může být promítán i na stěny či objekty zavěšené ve vzduchu.
Doplňuje se ...
vysoke´ucˇenítechnicke´v brneˇ
Pro realistické kreslení scény se postupem času vyvinulo množství metod a postupů,
řešících různé aspekty problému. Liší se požadavky na reprezentaci prostorových dat, možnostmi a samozřejmě kvalit...
Měřič výkonnostních charakteristik OpenGL - merlin
Evaluátor (Evaluator) má na starosti aproximaci křivek a povrchů ze vstupních parametrických
dat. Na výstupu tohoto bloku se objevují informace o jednotlivých vrcholech.
Jednotka pro operaci s vrch...
Referát k OpenGL
implementace v souladu s jeho specifikací. Tuto roli převzalo konsorcium ARB (Architecture Review Board),
do kterého patří firmy Digital Equipment Corporation (DEC), Hewlett-Packard, IBM, Intel, In...
Algoritmy pro zobrazov´anı stın˚u ve sc´enˇe
polohu a vlastnosti světelného zdroje. Proto v počı́tačové grafice, která se snažı́ zobrazovat naši
realitu co nejvěrněji, patřı́ technikám vytvářejı́cı́ stı́ny důležité mı́sto.
Vy...
Technická univerzita v Liberci
programovacího prostředí pomocí Add References. Hlavní část programu, která vytvoří
OpenGL okno pomocí výše uvedené knihovny jsem vyhledal na internetu a je pro všechny
OpenGL aplikaci s touto knih...