Infomáció megjelenítés Számítógépes ábázolás D. Iványi Péte
Megvilágítás, ányékolás Realisztikus képhez ányékolás kell Modellezés összetett nagy számítási igenyű
Megvilágítás, ányékolás OpenGL egyszeűsített modellt használ Kolátozott ealizmus Lokális illuminációs model: Egy pont megjelenése csak a fény foáshoz képesti viszonytól függ, más objektumot nem vesz figyelembe Nincs ányék, tüköződés, stb. De tükkök alkalmazhatók
Lokális modell Pontosan középen van a fényfoás Lokális megvilágítási modell!!! A gömböknek ki kellene takani a fényt
Iányított fény
Reflekto
Fizikai jelenség Fény A fényfoásból nagy számú foton indul el A foton színe A színt háom komponenssel fogjuk epezentálni: RGB: Red (vöös), Geen (zöld), Blue (kék) Intenzitás, fényeősség Fotonok száma egy adott teületen adott idő alatt Feltételezve hogy vákum van a fotonok elének egy felületet, 3 dolog töténhet
Visszaveődés: Jelenségek Tökéletesen síma felület esetén a beesési szög megegyezik a visszaveődési szöggel Duva felületnél a fotonok minden iányba egyenletesen veődnek, így nincs tüköződés tükö acél műanyag
Visszaveődés A felületek a teljesen diffúzív és spekuláis visszaveődés között vannak
Fényelnyelés Enegiává alakul Jelenségek Például egy objektum zöldnek látszik mivel a zöld hullámhosszú fotonokot visszavei, a többit elnyeli Tanszmisszió Átmegy a felületen (átlátszó objektumok) Valóságban ezek kombinációja
Látás A foton elhagyja a fényfoást, különbözőképpen veődik, közegeken átmegy, majd eléi a szemet Amit látunk az a szembe ékező fotonok függvénye Minnél pontosabban modellezzük a fizikai jelenséget annál ealisztikusabb lesz a kép
Fényfoások, OpenGL Pontból sugáoz A kisugázott enegia leíható RGB komponensekkel Intenzitás két összetevőből Könyező (ambiens) sugázás Egyenletesen minden iányból jön Minden pontot megvilágít, még ha a foásból közvetlenül nem is látható Pontszeű sugázás Csak azokat a pontokat éinti, melyek közvetlenül láthatók a foásból
Láthatóság Helyesen végehajtva, sok objektumnál nagy a számítási igény OpenGL csak azt ellenőzi, hogy a felület a fényfoás felé néz-e Q Nomális kifelé mutat (n) P-től a fényfoás felé mutató vekto(l=q-p) A pont meg van világítva, ha n l > 0
Attenuation (Intenzitás csökkenés) A fényeősség csökken ahogy nő a távolság a fényfoástól Intenzitás egy megvilágított P pontban (Q foásból) OpenGL-ben ez túl sötét képeket mutatna, így ) ( 1 ), ( 2 Q I Q P Q P I = ) ( 1 ), ( 2 Q I cd bd a Q P I + + =
Reflektook Intenzitás egy iány mentén a legnagyobb A fény elhal egy szög után fényfoás
Felületek Objektumok nem átlátszóak (opaq) Phong modell, felületi tüköződést komponenseke osztjuk Bui Thong Phong, Univesity of Utah, 1973 Lokális tüköződési modell (másodendű hatásokat nem vesz figyelembe), Kompenzációként bevezeti a könyezeti (ambiens) fényt 3 tüköződési komponens van
Phong tüköződési modell Emisszió: objektumok melyek fényt bocsátanak ki fényfoástól független Más objektumokat nem világít meg Könyezeti (ambiens) tüköződés: Indiekt tüköződés Bámely pozícióban lévő, bámely iányú felületet megvilágít ez a fényenegia Diffúz, szót tüköződés Spekuláis tüköződés Síma felületeken egy világos pont
Phong tüköződési modell
OpenGL modell alapok A fényfoás intenzitása: L = ( L, Lg, Lb Intenzitás háom komponensű: ) Ambiens, L a Diffúz, L d Spekuláis, L s Minden tüköződési komponens felbontható RGB színeke, például: L d = ( Ld, Ldg, Ldb)
OpenGL modell alapok Objektum színe: mennyit ve vissza a felület az adott intenzitásból C = C, C, C ) ( g b A színeket [0,1]közé nomalizáljuk Amiko egy L intenzitású fény egy C színű objetumot é el, akko a visszaveődő fény LC = ( LC, LgCg, LbCb )
LC = Például OpenGL modell alapok ( LC, LgCg, LbCb ) Fehé fény: L=(1,1,1) Vöös objektum: C=(1,0,0) Visszaveődő szín: LC=(1,0,0) vöösnek látszik Kék fény: L=(0,0,1) Vöös objektum: C=(1,0,0) Visszaveődő szín: LC=(0,0,0) feketéneklátszik
Visszaveődő szín
OpenGL modell alapok Valójában az objektum színét is felbontjuk: Ambiens Diffúz és Spekuláis komponense
Nomál vekto: n Néző vekto: v Fényfoás vekto: l Vektook Visszaveődési vekto: Felező vekto: h (l és v szögfelezője)
Visszaveődési vekto Mindegyik vekto egység hosszúságú l vekto meőleges vetülete n-e l l l l l l l = + = + = = = n n n u n u n n n ) 2( ) 2( 2 ) (
Két vekto átlaga Felező vekto Mivel úgyis nomalizáljuk így egyszeűsíthető h = nom(( l + v) / 2) = nom( l + v)
Phong modell, ambiens fény Ambiens (könyező) fény tüköződés I a a visszaveődő ambiens fény intenzitása 0 ρ 1 visszaveődő ambiens fény aánya a I a = ρ a L a C
Phong modell, diffúz fény Diffúz fény tüköződés Lambet tüköződés A felület miko szinten sok, kis felület daabból áll és ezek minden iányban szétszóják a fényt Azonos a fényesség minden iányból (Lambet koszinusz tövénye) Például: nomál fa felület (políozás nélkül)
Lambet koszinusz tövénye A fotonok száma pe szekundum aányos az ék nagyságával Ék magassága: átméő*cosq Fotonok intenzitása: I Fotonok száma pe sec: I*dW*dA*cosQ Lambet tükö
Lambet koszinusz tövénye Amitlátunk: dw 0 látószög esetén a látóteület da 0 Felülől nézve Bizonyos szögben nézve Ugyanakkoa tüköződő intenzitást kapunk (adiance)
Phong modell, diffúz fény I d a visszaveődő diffúz fény intenzitása 0 ρ d 1 diffúz tüköződési konstans (felület tulajdonság) Ha n és l is nomalizált akko Ha cos Θ ( n l ) < 0 Id d max( 0, n = ρ l) Ld C akko a pont a sötét oldalon van a hígulást is figyelembe kell venni = ( n l)
Phong modell, spekuláis fény A legtöbb felület nem tökéletes Lambet tükö Egyik leggyakoibb eltéés a fémes felületeknél a fényes pont Tüköződés nem teljesen véletlenszeű, hanem bizonyos tövényszeűséget pefeál, vagyis azt hogy a beesési szög és a visszaveődési szög azonos OpenGL nem a visszaveődési vektot hanem a felező vektot használja
Phong modell, spekuláis fény I s a visszaveődő spekuláis fény intenzitása 0 ρ s 1 spekuláis tüköződési konstans (felület tulajdonság) fényesség: a ahogy a növekszik a spekuláis tüköződés gyosabban hal el 1 és 1000 közötti is lehet I s = ρ max(0, n h) s α L s a hígulást is figyelembe kell venni
Phong megvilágítási egyenlet Ezt az egyenletet az R, G és B komponenseke is vége kell hajtani ( ) s s d d a a e s d a e L h n C L n cd bd a C L I I I I cd bd a I I I α ρ ρ ρ ) max(0, ) max(0, 1 ) ( 1 2 2 l + + + + + = + + + + + =
OpenGL, intepoláció Felületenként Simított, intepolált
OpenGL, intepoláció Oldalankénti nomális Pontonkénti nomális
OpenGL, intepoláció Gouaud intepoláció (OpenGL) A Phong egyenletet pontosan kiszámoljuk a csomópontoknál (vetex) majd a poligon belsejében ezekből intepolálunk Phong intepoláció A nomál vektookat pontosan meghatáozzuk a csomópontoknál, majd a poligon belsejében ezekből intepolálunk A Phong egyenletben ezeket az intepolált nomál vektookat használjuk
OpenGL megvalósítás A megvilágításhoz 3 lépés kell A megvilágítási és ányékolási modell beállítása A fényfoások definiálása Objektum anyagának definiálása
Megvilágítási modell beállítása glenable(gl_lighting) Avilágítás bekapcsolása glshademodel() GL_FLAT: a poligon minden pontját azonos módon kezeli GL_SMOOTH: a csomópontokban megállapított étékeket intepolálja
Megvilágítási modell beállítása gllightmodelf(glenum pname, GLfloat paam) gllightmodelfv(glenum pname, GLfloat *paam) pname GL_LIGHT_MODEL_AMBIENT GL_LIGHT_MODEL_LOCAL_VIEWER GL_LIGHT_MODEL_TWO_SIDE
A fényfoások definiálása 8 fényfoás definiálható, ezeket be kell kapcsolni glenable(gl_light0) Paaméteek beállítása gllight*()
Pogamészlet GLfloat amb_int[4] = {0.9, 0.0, 0.0, 1.0}; GLfloat oth_int[4] = {1.2, 1.2, 1.2, 1.0}; GLfloat pos[4] = {2.0, 4.0, 5.0, 1.0}; glenable(gl_light0); glligthfv(gl_light0, GL_AMBIENT, amb_int); glligthfv(gl_light0, GL_DIFFUSE, oth_int); glligthfv(gl_light0, GL_SPECULAR, oth_int); glligthfv(gl_light0, GL_POSITION, pos); // 4. komponens: alfa (több céla is)
Objektum anyagának definiálása Poligonok oldalaikülön-külön vagy egybe is megadható glmateialf(glenum face, face: GL_FRONT GL_BACK GL_FRONT_AND_BACK pname: GL_EMISSION GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_SHININESS GLenum pname, GLfloat paam)
További opciók Zát objektumok esetén a nem látható felületeket nincs ételme megajzolni glenable(gl_cull_face) glcullface( ) /* GL_FRONT vagy GL_BACK */ Az ányékoláshoz nomál vektookat kell megadni glnomal3d( ), glnomal3f( ) Egység hosszú legyen vagy OpenGL nomalizálja glenable(gl_normalize)
Példák gomb.c shinyjet.c
OpenGL pogamészlet, light.c void myinit (void) { GLfloat light_ambient[] = { 0.0, 0.0, 1.0, 1.0 }; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_specula[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; gllightfv (GL_LIGHT0, GL_AMBIENT, light_ambient); gllightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse); gllightfv (GL_LIGHT0, GL_SPECULAR, light_specula); gllightfv (GL_LIGHT0, GL_POSITION, light_position); glenable (GL_LIGHTING); glenable (GL_LIGHT0); gldepthfunc(gl_less); glenable(gl_depth_test); }
OpenGL pogamészlet void display (void) { glclea (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT); glpushmatix (); glrotatef (20.0, 1.0, 0.0, 0.0); glpushmatix (); gltanslatef (-0.75, 0.5, 0.0); glrotatef (90.0, 1.0, 0.0, 0.0); glutsolidtous (0.275, 0.85, 15, 15); glpopmatix (); glpushmatix (); gltanslatef (-0.75, -0.5, 0.0); glrotatef (270.0, 1.0, 0.0, 0.0); glutsolidcone (1.0, 2.0, 15, 15); glpopmatix (); glpushmatix (); gltanslatef (0.75, 0.0, -1.0); glutsolidsphee (1.0, 15, 15); glpopmatix (); glpopmatix (); glflush (); }
OpenGL pogamészlet
Példa Aluminium Réz Aany Vöös fém Kék műanyag
Nincs ambiens Fehé ambiens Színes ambiens
Iodalom H. Gouaud, "Continuous shading of cuved sufaces," IEEE Tansactions on Computes, 20(6):623 628, 1971.