Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Framebuffer
2
Miről lesz szó? Milyen bufferekből áll a framebuffer?
Az egyes bufferek törlése és irási engedélyek Bufferek paraméterei Egyes bufferek alkalmazásai Mintaprogramok
3
Framebuffer Minden buffer, egy téglalap alakú tartomány. Kétdimenziós vektor. Az adattípus a bufferen belül azonos. Az egyes bufferek eltérő adattípusokat tárolhatnak. A framebuffer a következő bufferekből áll: Szín buffer (color buffer) Mélység buffer (depth buffer) Stencil buffer Accumlation buffer
4
Framebuffer Az adott OpenGL implementáció függvénye az egyes bufferek mérete és pontossága. Minden OpenGL implementációnak tartalmaznia kell: 1 szín buffert (RGBA), egy hozzá tartozó mélység-, stencil és accumlation buffert. Color-index mód a mai változatokban már nem jellemző. A bufferek bithosszúságának lekérdezése: glGetIntegerv() paraméter jelentés GL_RED_BITS, GL_GREEN_BITS A bitek száma RGBA komp.szerint. GL_BLUE_BITS, GL_ALPHA_BITS GL_DEPTH_BITS A mélységbuffer (16, 32 bit) GL_STENCIL_BITS A stencilbuffer (8 bit) GL_ACCUM_RED_BITS Az accumlation buffer GL_ACCUM_GREEN_BITS RGBA komponensei GL_ACCUM_BLUE_BITS, GL_ACCUM_ALPHA_BITS
5
Szín bufferek Minden OpenGL implementáció tartalmaz: egy „front-left” buffert. Kiegészítő lehetőségek: GL_STEREO esetén „left” és „right” bufferek használhatóak. GL_DOUBLE_BUFFER esetén „front” és „back” buffereket használhatunk. GL_AUX_BUFFERS: kiegészítő bufferek is alkalmazhatók.
6
Mélység buffer Minden pixele egy mélység értéket tárol; a szemtől (vagy a szem síkjától) való távolságot. Z-buffernek is nevezik, mivel az x és y irányok a képernyő irányát jellemzik, a z irány pedig a képernyőtől mért távolságot „mélységet” jelen(the)ti.
7
Stencil buffer Egzakt definíció nincs, az alkalmazások alapján a működés megérthető. Legegyszerűbb alkalmazása: A színbuffer egy bizonyos részére megtiltható vele a rajzolás. A benne tárolt értékeket: pl. pixeltranszfer függvények a szín bufferbe írás a mélység bufferbe írás, stb. változtathatják.
8
Accumlation buffer 1 darab van belőle. RGBA komponenseket tartalmaz.
Több képfázis segítségével állíthatjuk elő a végleges képet Közvetlenül nem írható. Alkalmazásai: antialiasing motion blur depth of field
9
Bufferek törlése Törlésértékek beállítása: Törlés glClearColor()
glClearIndex() glClearDepth(float depth) glClearStencil(int s) glCrearAccum(float r, float g, float b, float a,) Törlés glClear() GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT
10
Színbufferek kiválasztása íráshoz
glDrawBuffer(GLenum mode) GL_FRONT, GL_BACK, GL_RIGHT, GL_LEFT, GL_FRONT_RIGHT, GL_FRONT_LEFT, GL_BACK_RIGHT, GL_BACK_LEFT, GL_AUXi GL_FRONT_AND_BACK Megjegyzések: Több buffert is kiválaszthatunk írásra. (Különböző eredményeket is kaphatunk az eltérő alpha értéket miatt.) GL_AUXi: i = 0 .. (GL_AUX_BUFFERS-1)
11
Maszkolás A bufferbe írás előtt maszkolással eldönthető, hogy történjen-e írás: glIndexMask(GLuint mask) glColorMask(GLboolean r, GLboolean g, GLboolean b, GLboolean alpha) glDepthMask(GLBoolean flag) glStencilMask(GLuint mask) ColorIndex és Stencil Mask esetén bitenkénti ÉS művelet hajtódik végre a paraméter értéke és az aktuális pixel között. Beállítható melyik bitplane írható. Depth buffer esetén. GL_TRUE írható, GL_FALSE nem írható buffert állít be. Color Buffer estén az egyes színkomponensek kölön-külön is írhatóak.
12
Buffertesztek Scissor test Alpha test Stencil test Depth test
13
Scissor test glScissor(GLint x, GLint y, GLsizei width, GLsizei height); glEnable(GL_SCISSOR) után a x,y,width,height által megadott téglalapba nem történik rajzolás A stencil buffer segítségével is ugyanez az eredmény érhető el. A scissoring gyorsabb. Alkalmazása: a felülírás megakadályozása a képernyő egy téglalap alakú tartományában.
14
Alpha test Az alpha érték segítségével szabályozhatjuk a színbufferbe való írást. Bekapcsolása: glEnable(GL_ALPHA_TEST); glAlphaFunc(GLenum func, GLclampf ref); paraméter érték GL_NEVER nem történik írás GL_ALWAYS teszt nélkül, mindig történik írás GL_LESS frag. < ref GL_LEQUAL frag. <= ref GL_EQUAL frag. = ref GL_GEQUAL frag. >= ref GL_GREATER frag. > ref GL_NOTEQUAL frag. != ref
15
Alpha test Alkalmazás:
Pl: Átlátszóság: kétszer kell kirajzolni a képkockát, először azokat az értékeket fogadva el, amelyeknél alpha=1, majd másodszorra ahol alpha != 1. A depth test mindkét esetben működik, de a második alkalommal a depth buffert read-only-ra kell beállítani. Textúrázás, decal mód. Átlátszó textúrákat lehet létrehozni. Ahol átlátszó a textúra, ott alpha=1, ahol nem, ott alpha=0.5, és Ref=0.5. E meleltt az alpha test: GL_GREATHER.
16
Stencil test A stencilezésnél a referencia érték és a stencil bufferben tárolt érték között történik összehasonlítás. A teszt eredményétől függően módosul a stencil buffer. glStencilFunc(GLenum func, Glint ref, GLunib mask); func: GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL Ha GL_LESS, akkor ha ref < stencil, akkor mask&ref és mask&stencil. Alapértelmezetten: func=GL_ALWAYS, ref=0, mask=255 így a stencilezés kikapcsolva van.
17
Stencil test glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
Hogyan változik a stencil buffer, ha a stencil test igaz vagy hamis, vagy a zbuffer teszt igaz, vagy hamis. Mindhárom paraméter a következő értékeket veheti fel: GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT. GL_KEEP: az érték megtartása GL_ZERO: kicseréli nullára GL_REPLACE: a referencia értékkel cseréli ki GL_INCR, GL_DECR: növeli, csökkenti GL_INVERT: invertálja Alapértelmezett értékek: GL_KEEP, GL_KEEP, GL_KEEP. Tehát minden esetben megtartja a stencil bufferben tárolt értéket
18
Stencil példa A legegyszerűbb alkalmazás: rajzoláskor tetszőleges tartomány figyelmen kívül hagyásával: A stencil buffer feltöltése 0-val. Az alakzat kirajzolása, stencli = 1-el. glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); Ne rajzoljon oda ahol a stencil=1, glStencilFunc (GL_NOTEQUAL, 0x1, 0x1); Példa forrás: stencil/stencil.c
19
Accumlation buffer Nem lehet közvetlenül írni az accumlation bufferbe. A kép fázisait lehet „akkumlálni”, majd az eredmény visszaírni a színbufferbe. Ez természetesen lassabb, mint egyszer írni a színbufferbe. Az akkumlációs bufferben képfázisok megőrzésére is mód nyílik. Alkalmazása: antialiasing, motion blur, depth of field effects
20
Accumlation buffer glAccum(GLenum op, GLfloat value);
op: GL_ACCUM, GL_LOAD, GL_RETURN, GL_ADD, GL_MULT GL_ACCUM: R,G,B,A komponenseket szorozza a value –vel, majd az eredményt az akkumlációs bufferhez adja. GL_LOAD: ugyanaz mint az előző, de nem adja hozzá, hanem felülírja az akkumlációs buffert. GL_RETURN: az akkumlációs buffer tartalma visszaíródik a színbufferbe. GL_ADD, GL_MULT: a value-t hozzáadja, vagy vele megszorozza az akkumlációs buffer tartalmát. Az eredmény ugyancsak az akkumlációs bufferben lesz.
21
Példa: Scene antialiasing
Lépések: Akkumlációs buffer törlése A front buffer bekapcsolása N szer rajzoljuk ki a képet eltérő pozíciókban, eltérő értékekkel: glAccum(GL_ACCUM, 1.0 / N); // (1.0/N)=const Az utolsó lépésben kapjuk vissza az eredményt: glAccum(GL_RETURN, 1.0); Megjegyzés: ha nem akarjuk, hogy a köztes fázisok látszanak, akkor rendeleljünk a hátsó bufferbe.
22
Példa: accanti.c (ortogonális)
A jitter.h előre definiálja az eltolások tömbjét, amit a glTranslate()-ben alkalmazunk. Feladat: próbáljuk ki valamelyik más jitter értéket: 2,3,4,8,24,66 alkalmazni a for() ciklusban.
23
Példa: accpersp.c (perspektívikus)
accFrustum(): első 6 paraméter megfelel a glFrustum() paramétereinek. pixdx, pixdy: antialias eltolások pixelben eyedx,eyedy: a nézőpont eltolás a depth of field hatásnál focus: >0 Elemezzük az accPerspective()-t!
24
Motion blur motionblur.cpp
25
Depth of field Dof.c
26
Árnyék teapot.c
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.