Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Átlátszóság, csipkézettség, köd
2
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
3
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)
4
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ó
5
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
6
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)
7
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)
8
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)
9
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).
10
Blending Három kép ‘összemosása’ egyenlő mértékben.
forrás faktor: GL_SRC_ALPHA cél faktor: GL_ONE alpha = (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 Rd 1, Gs Gd 1, Bs Bd 1, As Ad 1).
11
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 = (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ő!
12
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
13
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
14
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?
15
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!
16
gömb az átlátszó kockában (alpha3D.cpp)
Példa gömb az átlátszó kockában (alpha3D.cpp)
17
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();
18
Csipkézettség mentesítés (antialiasing)
19
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
20
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.
21
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.
22
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 += ; glRotatef(fRot,0.0,1.0,1.0);}
23
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);
24
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)
25
Poligon antialiasing - aapoly.cpp
Példa Poligon antialiasing - aapoly.cpp
26
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!
27
Élethű rendelerés köd alkalmazásával
28
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
29
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
30
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
31
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
32
Köd
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.