Átlátszóság, csipkézettség, köd
A tanult témakörök összefoglalása Geometria megadása és kirajzolása Geometria transzformálása, vetítése A teljesítmény növelése érdekében megjelenítési listák alkalmazása Fények és anyagtulajdonságok megadása
Miről lesz szó? Átlátszó színek megadásával (transculent) átlátszó felületek képezése Poligonok és vonalak csipkézettség mentesítése (antialiasing) Légköri hatások (atmospheric effects) megadása pl. köd (fog)
Blending (keverés) Közvetlenül azelőtt történik, amikor a pixelek a szín-bufferbe íródnak. ‘Blending’ nélkül az új színértékek felülírják a régieket. ‘Blending’ segítségével szabályozhatjuk, milyen mértékben kombinálódjon a tárolt szín az új színnel. Color-index módban a blending funkció nem használható
Blending A legtermészetesebb megközelítés szerint az RGB-reprezentálja a színt, az alpha érték pedig az átlátszóságot. Forrás és cél faktorok: A bejövő szín (forrás) kombinálódik a tárolt pixellel (cél) forrás és cél faktorok segítségével a következőképpen: (RsSr+RdDr , GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) , ahol: (Sr,Sg,Sb,Sa) forrás faktor (Dr,Dg,Db,Da) cél faktor (Rs,Gs,Bs,As) forrás (bejövő) szín (Rd,Gd,Bd,Ad) cél (tárolt) szín
Blending glBlendFunc(GLenum sfactor, GLenum dfactor) – segítségével adható meg a forrás és cél faktorok generálási szabálya: konstans melyik faktor? Blend faktor GL_ZERO forrás, cél (0,0,0,0) GL_ONE (1,1,1,1) GL_DST_COLOR cél (Rd,Gd,Bd,Ad) GL_SRC_COLOR forrás (Rs,Gs,Bs,As)
Alapértelmezett beállítás: glBlendfunc(GL_ONE, GL_ZERO); Milyen hatást vált ez ki? (RsSr+RdDr , GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) => (Rs 1+Rd 0 , Gs 1+Gd 0, Bs 1+ Bd 0, As 1+Ad 0). A forrás eredeti értékén marad, a cél pedig nullázódik, ami az új érték felülírását jelenti. Bekapcsolás – kikapcsolás: glEnable(GL_BLEND), glDisable(GL_BLEND)
konstans melyik faktor? Blend faktor GL_ONE_MINUS_DST_COLOR forrás (1,1,1,1) - (Rd, Gd, Bd, Ad) GL_ONE_MINUS_SRC_COLOR cél (1,1,1,1) - (Rs, Gs, Bs, As) GL_SRC_ALPHA forrás,cél (As,As,As,As) GL_DST_ALPHA forrás, cél (Ad,Ad,Ad,Ad) GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) – (As,As,As,As) GL_ONE_MINUS_DST_ALPHA (1,1,1,1) – (Ad,Ad,Ad,Ad) GL_SRC_ALPHA_SATURATE source (f,f,f,1); f = min(As,1-Ad)
Blending Nem minden a táblázatban felsorolt értékek kombinációjának van értelme! Példák: Két kép ‘összemosása’ 50-50%-ban. forrás faktor: GL_ONE, majd első kép kirajzolása, cél faktor: GL_SRC_ALPHA, majd a második kép kirajzolása alpha = 0.5-el. (RsSr+RdDr , GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) => (Rs 1+Rd 0.5 , Gs 1+Gd 0.5, Bs 1+ Bd 0.5, As 1+Ad 0.5).
Blending Három kép ‘összemosása’ egyenlő mértékben. forrás faktor: GL_SRC_ALPHA cél faktor: GL_ONE alpha = 0.333. (ez biztosítja az egyenlő mértéket) Majd rajzold ki mind a három fázist! (RsSr+RdDr , GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) => (Rs 0.333+Rd 1, Gs 0.333+Gd 1, Bs 0.333+ Bd 1, As 0.333+Ad 1).
Blending Paint program ‘brush’ funkciója, amely a képhez az ecset színét 10%-ban hozzáadja a képhez. forrás faktor: GL_SRC_ALPHA alpha = 0.1. (ez biztosítja a 10%-ot) az ecset kirajzolása cél faktor: GL_ONE_MINUS_SRC_ALPHA (RsSr+RdDr , GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) => (Rs 0.1+Rd (1-Rs 0.1) , Gs 0.1+Gd (1-Gs 0.1), Bs 0.1+Bd (1-Bs 0.1), As 0.1+Ad (1-As 0.1)). Az ecset ‘belseje’ felé haladva az alpha érték növelhető!
Példa (2D) alpha.c példa alapján megfigyelhető a átlátszó takarás. t-billentyűvel váltható, melyik háromszög legyen felül
Példa (2D) void init() { glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glShadeModel (GL_FLAT); glClearColor (0.0, 0.0, 0.0, 0.0); } (RsSr+RdDr , GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) => (Rs 0.75+Rd (1-Rs 0.75) , Gs 0.75+Gd (1-Gs 0.75), Bs 0.75+Bd (1-Bs 0.75), As 0.75+Ad (1-As 0.75)). Az első háromszög kirajzolásakor a Rd,Gd,Bd,Ad értékek nullázva vannak. A második esetén az új szín 75%-ban érvényesül
3D Blending A blending hatása függ a poligonok kirajzolási sorrendjétől, térbeli elrendezésétől Hogyan működött a mélység-buffer? Mi lehet a probléma ha mélység buffert a ‘blending’ funkcióval együttesen alkalmazzuk?
3D Blending Megoldás: Depth-buffering bekapcsolása, de csak olvashatóvá tétele. (read-only) Nem átlátszó tárgyak kirajzolása először (opaque). Normál z-buffer működés mellett. A z értékek levédése (read-only z-buffer) Az átlátszó tárgyak kirajzolása. Az átlátszatlan tárgyak mögé eső részek nem lesznek kirajzolva. Az átlátszatlan tárgyak elé eső poligonok viszont nem írják felül a z-buffert!
gömb az átlátszó kockában (alpha3D.cpp) Példa gömb az átlátszó kockában (alpha3D.cpp)
Feladat ok A kocka átlátszóság-értékének módosítása. alpha3d.cpp kódjának módosítása úgy, hogy a kocka keringjen a gömb körül! Megoldás: (egyik lehetséges) glPushMatrix(); glRotatef (fRoty, 0.0, 1.0, 0.0); glTranslatef(1.5,0,0); glPushMatrix (); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_transparent); glEnable (GL_BLEND); glDepthMask (GL_FALSE); glBlendFunc (GL_SRC_ALPHA, GL_ONE); glCallList (cubeList); glDepthMask (GL_TRUE); glDisable (GL_BLEND); glPopMatrix (); glPopMatrix();
Csipkézettség mentesítés (antialiasing)
Csipkézettség mentesítés (antialiasing) glHint(GLenum target, GLenum hint); hint paraméter: GL_FASTEST, GL_NICEST, GL_DONT_CARE target paraméter: GL_PERSPECTIVE_CORRECTION_HINT GL_POINT_SMOOTH_HINT GL_LINE_SMOOTH_HINT GL_POLIGON_SMOOTH_HINT GL_FOG_HINT
Csipkézettség mentesítés (antialiasing) Pontok és vonalak esetén glEnable(), glDisable(), GL_POINT_SMOOTH, GL_LINE_SMOOTH A ‘blending’ is szerepet kap a csipkézettség csökkentésében: Az OpenGL egy vonal kirajzolásakor ‘coverage’ értékeket számol és alpha értékként menti le. Blending funkció segítségével eltérő (halványabb) színt rendelhetünk a coverage értékekhez.
Coverage (fedés) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) beállítás biztosítja a csipkézettség-mentesítő hatást. A hatás akkor jobban megfigyelhető, ha magasabb alpha értéket állítunk be.
Példa (anti.cpp) Feladat: Kapcsoljuk ki a glEnable(GL_LINE_SMOOTH)-t Kapcsoljuk ki a glEnable (GL_BLEND);-t Változtassuk meg a vonalvastagságot! A fenti három kombinációi Próbáljuk ki: glBlendFunc (GL_SRC_ALPHA, GL_ONE); -al Mit tapasztalunk? Ujjgyakorlat: forogjon az ikozaéder automatikusan! Használjuk fel a következő függvényeket: glutInitDisplayMode (GLUT_DOUBLE….); glutIdleFunc(display); glutSwapBuffers(); {fRot += 0.00001; glRotatef(fRot,0.0,1.0,1.0);}
Poligonok csipkézettségmentesítése (antialiasing poligons) Poligonok esetén is hasonlók a teendők: Blending funkció bekapcsolása, glEnable(GL_BLEND); Poligon smooth funkció bekapcsolása, glEnable(GL_POLIGON_SMOOTH); Mélységbuffer kikapcsolása, glDisable (GL_DEPTH_TEST);
Poligonok csipkézettségmentesítése (antialiasing poligons) Blending művelet: GL_SRC_ALPHA_SATURATION (forrás) GL_ONE (cél) A kialakuló szín a cél szín és a skálázott forrásszín összege. (mivel a cél GL_ONE.) A skálázási faktor: vagy a forrás alpha érték, vagy (1-cél) alpha érték. A nagy alpha értékkel bejövő pixelek kevéssé hatnak a végleges színre. (1-alpha miatt) A poligonok szélső pixeleinek színe keveredhet a később rajzolt (egy másik él, érintkező él) színével. GL_SRC_ALPHA_SATURATE source (f,f,f,1); f = min(As,1-Ad)
Poligon antialiasing - aapoly.cpp Példa Poligon antialiasing - aapoly.cpp
Feladatok aapoly.cpp adjunk a kódhoz automatikus forgást! (dupla-bufferelés, IdleFunc, kis szögelfordulás-növekmény) Az init() paramétereit változtassunk meg! Hagyjuk bekapcsolva a z-buffert a blendingel együtt!
Élethű rendelerés köd alkalmazásával
Köd A valóságban nincsenek a felületek között éles átmenetek Szinte minden felület-felület érintkezés kicsi lekerekítéssel rendelkezik Az OpenGL ‘köd’ egy gyűjtőfogalom Segítségével ködfátyol, homály, füst, szürkület szimulálható A ködszín megadásával, a nézőponttól távoli tárgyak fokozatosan a ködszínbe halványulnak
Köd OpenGL köd használata egyszerű glEnable(GL_FOG); glFog*() a tulajdonságokat kontrolálja GL_EXP GL_EXP2 GL_LINEAR glHint(GL_FOG_HINT); a minőségre van hatással
Köd glFog{if}{v}(GLenum pname, TYPE param) pname: GL_FOG_MODE param: GL_EXP (alapértelmezett), GL_EXP2, GL_LINEAR pname: GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END param: a ködegyenletek paraméterei pname: GL_FOG_COLOR, param: színvektor pname: GL_FOG_INDEX
Ködegyenletek A pixel színértéke a következő képlet alapján számítható: Ci: a eredeti szín Cf: a ködszín
Köd