Framebuffer 1 Mirl lesz sz Milyen bufferekbl ll
Framebuffer 1
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 2
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 3
Framebuffer Az adott Open. GL implementáció függvénye az egyes bufferek mérete és pontossága. ► Minden Open. GL 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: gl. Get. Integerv() paraméter GL_RED_BITS, GL_GREEN_BITS jelentés 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 4
Szín bufferek ► Minden Open. GL 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. 5
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. 6
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. 7
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 8
Bufferek törlése ► Törlésértékek beállítása: § gl. Clear. Color() § gl. Clear. Index() § gl. Clear. Depth(float depth) § gl. Clear. Stencil(int s) § gl. Crear. Accum(float r, float g, float b, float a, ) ► Törlés § gl. Clear() ►GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT 9
Színbufferek kiválasztása íráshoz ► gl. Draw. Buffer(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) 10
Maszkolás ►A bufferbe írás előtt maszkolással eldönthető, hogy történjen-e írás: § gl. Index. Mask(GLuint mask) § gl. Color. Mask(GLboolean r, GLboolean g, GLboolean b, GLboolean alpha) § gl. Depth. Mask(GLBoolean flag) § gl. Stencil. Mask(GLuint mask) Color. Index é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. 11
Buffertesztek ► Scissor test ► Alpha test ► Stencil test ► Depth test 12
Scissor test ► gl. Scissor(GLint x, GLint y, GLsizei width, GLsizei height); § gl. Enable(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. 13
Alpha test ► Az alpha érték segítségével szabályozhatjuk a színbufferbe való írást. Bekapcsolása: gl. Enable(GL_ALPHA_TEST); ► gl. Alpha. Func(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 14
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. 15
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. ► gl. Stencil. Func(GLenum func, Glint ref, GLunib mask); § func: GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, 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. 16
Stencil test ► gl. Stencil. Op(GLenum zpass); fail, GLenum zfail, GLenum § 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 ► GL_INCR, GL_DECR: növeli, csökkenti ► GL_INVERT: invertálja ki § Alapértelmezett értékek: GL_KEEP, GL_KEEP. Tehát minden esetben megtartja a stencil bufferben tárolt értéket 17
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. ►gl. Stencil. Op(GL_REPLACE, GL_REPLACE); GL_REPLACE, § Ne rajzoljon oda ahol a stencil=1, gl. Stencil. Func (GL_NOTEQUAL, 0 x 1); § Példa forrás: stencil/stencil. c 18
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 19
Accumlation buffer ► gl. Accum(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. 20
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: ►gl. Accum(GL_ACCUM, 1. 0 / N); // (1. 0/N)=const § Az utolsó lépésben kapjuk vissza az eredményt: ►gl. Accum(GL_RETURN, 1. 0); Megjegyzés: ha nem akarjuk, hogy a köztes fázisok látszanak, akkor rendeleljünk a hátsó bufferbe. 21
Példa: accanti. c (ortogonális) ►A jitter. h előre definiálja az eltolások tömbjét, amit a gl. Translate()-ben alkalmazunk. ► Feladat: próbáljuk ki valamelyik más jitter értéket: 2, 3, 4, 8, 24, 66 alkalmazni a for() ciklusban. 22
Példa: accpersp. c (perspektívikus) ► acc. Frustum(): első 6 paraméter megfelel a gl. Frustum() 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 t! az acc. Perspective()23
Motion blur motionblur. cpp 24
Depth of field Dof. c 25
Árnyék teapot. c 26
- Slides: 26