Információ megjelenítés Számítógépes ábrázolás Dr. Iványi Péter
Megvilágítás, árnyékolás • Realisztikus képhez árnyékolás kell • Modellezés összetett nagy számítási igenyű
Megvilágítás, árnyékolás • OpenGL egyszerűsített modellt használ – Korlátozott realizmus – Lokális illuminációs model: • Egy pont megjelenése csak a fény forráshoz képesti viszonytól függ, más objektumot nem vesz figyelembe
– Nincs árnyék, tükröződés, stb. – De trükkök alkalmazhatók
Lokális modell • Pontosan középen van a fényforrás • Lokális megvilágítási modell!!! – A gömböknek ki kellene takarni a fényt
Irányított fény
Reflektor
Fény • Fizikai jelenség • A fényforrásból nagy számú foton indul el • A foton „színe” – A színt három komponenssel fogjuk reprezentálni: – RGB: Red (vörös), Green (zöld), Blue (kék)
• Intenzitás, fényerősség – Fotonok száma egy adott területen adott idő alatt
• Feltételezve hogy vákum van a fotonok elérnek egy felületet, 3 dolog történhet
Jelenségek • Visszaverődés: – Tökéletesen síma felület esetén a beesési szög megegyezik a visszaverődési szöggel – Durva felületnél a fotonok minden irányba egyenletesen verődnek, így nincs tükröződés
tükör
acél
műanyag
Visszaverődés • A felületek a teljesen diffúzív és spekuláris visszaverődés között vannak
Jelenségek • Fényelnyelés – Energiává alakul – Például egy objektum zöldnek látszik mivel a zöld hullámhosszú fotonokot visszaveri, a többit elnyeli
• Transzmisszió – Átmegy a felületen (átlátszó objektumok)
• Valóságban ezek kombinációja
Látás • A foton elhagyja a fényforrást, különbözőképpen verődik, közegeken átmegy, majd eléri a szemet • Amit látunk az a szembe érkező fotonok „függvénye” • Minnél pontosabban modellezzük a fizikai jelenséget annál realisztikusabb lesz a kép
Fényforrások, OpenGL • Pontból sugároz • A kisugárzott energia leírható RGB komponensekkel • Intenzitás két összetevőből – Környező (ambiens) sugárzás • Egyenletesen minden irányból jön • Minden pontot megvilágít, még ha a forrásból közvetlenül nem is látható
– Pontszerű sugárzás • Csak azokat a pontokat érinti, melyek közvetlenül láthatók a forrásból
Láthatóság • Helyesen végrehajtva, sok objektumnál nagy a számítási igény • OpenGL csak azt ellenőrzi, hogy a felület a fényforrás felé néz-e Q
• Normális kifelé mutat (n) • P-től a fényforrás felé mutató vektor(l=Q-P) • A pont meg van világítva, ha
r r n ×l > 0
Attenuation (Intenzitás csökkenés) • A fényerősség csökken ahogy nő a távolság a fényforrástól • Intenzitás egy megvilágított P pontban (Q forrásból) I ( P, Q ) =
1 P-Q
2
I (Q)
• OpenGL-ben ez túl sötét képeket mutatna, így I ( P, Q ) =
1 a + bd + cd
2
I (Q)
Reflektorok • Intenzitás egy irány mentén a legnagyobb • A fény elhal egy szög után fényforrás
Felületek • Objektumok nem átlátszóak (opaq) • Phong modell, felületi tükröződést komponensekre osztjuk – Bui Thong Phong, University of Utah, 1973 – Lokális tükröződési modell (másodrendű hatásokat nem vesz figyelembe), • Kompenzációként bevezeti a környezeti (ambiens) fényt
– 3 tükröződési komponens van
Phong tükröződési modell • Emisszió: objektumok melyek fényt bocsátanak ki – fényforrástól független – Más objektumokat nem világít meg
• Környezeti (ambiens) tükröződés: – Indirekt tükröződés – Bármely pozícióban lévő, bármely irányú felületet megvilágít ez a fényenergia
• Diffúz, szórt tükröződés • Spekuláris tükröződés – Síma felületeken egy világos pont
Phong tükröződési modell
OpenGL modell alapok • A fényforrás intenzitása: L = ( Lr , Lg , Lb ) • Intenzitás három komponensű: – Ambiens, La – Diffúz, Ld – Spekuláris, Ls
• Minden tükröződési komponens felbontható RGB színekre, például: Ld = ( Ldr , Ldg , Ldb )
OpenGL modell alapok • Objektum színe: mennyit ver vissza a felület az adott intenzitásból C = (C r , C g , C b ) • A színeket [0,1] közé normalizáljuk • Amikor egy L intenzitású fény egy C színű objetumot ér el, akkor a visszaverődő fény LC = ( Lr C r , Lg C g , Lb Cb )
OpenGL modell alapok LC = ( Lr C r , Lg C g , Lb Cb )
• Például – Fehér fény: L=(1,1,1) – Vörös objektum: C=(1,0,0) – Visszaverődő szín: LC=(1,0,0) vörösnek látszik – Kék fény: L=(0,0,1) – Vörös objektum: C=(1,0,0) – Visszaverődő szín: LC=(0,0,0) feketének látszik
Visszaverődő szín
OpenGL modell alapok • Valójában az objektum színét is felbontjuk: – Ambiens – Diffúz és – Spekuláris komponensre
Vektorok • Normál vektor: n • Néző vektor: v • Fényforrás vektor: l • Visszaverődési vektor: r • Felező vektor: h (l és v szögfelezője)
Visszaverődési vektor • Mindegyik vektor egység hosszúságú
• l vektor merőleges vetülete n-re r r r r n ¢ = ( n × l) n r r r u = n¢ - l r r r r r r r r r r r = l + 2u = l + 2( n¢ - l) = 2(n × l) n - l
Felező vektor • Két vektor átlaga • Mivel úgyis normalizáljuk így egyszerűsíthető r r r r r h = norm(( l + v ) / 2) = norm( l + v )
Phong modell, ambiens fény • Ambiens (környező) fény tükröződés – Ia a visszaverődő ambiens fény intenzitása – 0 £ r a £ 1 visszaverődő ambiens fény aránya
I a = r a La C
Phong modell, diffúz fény • Diffúz fény tükröződés – Lambert tükröződés – A felület mikro szinten sok, kis felület darabból áll és ezek minden irányban szétszórják a fényt – Azonos a fényesség minden irányból (Lambert koszinusz törvénye) – Például: normál fa felület (polírozás nélkül)
Lambert koszinusz törvénye • A fotonok száma per szekundum arányos az ék nagyságával • Ék magassága: átmérő*cosQ • Fotonok intenzitása: I • Fotonok száma per sec: I*dW*dA*cosQ
Lambert tükör
Lambert koszinusz törvénye • Amit látunk: dW0 látószög esetén a látóterület dA0 Felülről nézve Bizonyos szögben nézve
Ugyanakkora tükröződő intenzitást kapunk (radiance)
Phong modell, diffúz fény – Id a visszaverődő diffúz fény intenzitása – 0 £ r d £ 1 diffúz tükröződési konstans (felület tulajdonság) r r – Ha n és l is normalizált akkor cos Q = (n × l)
r r – Ha ( n × l) < 0 akkor a pont a sötét oldalon van r r I d = r d max(0, n × l) Ld C – a hígulást is figyelembe kell venni
Phong modell, spekuláris fény • A legtöbb felület nem tökéletes Lambert tükör • Egyik leggyakoribb eltérés a fémes felületeknél a fényes pont – Tükröződés nem teljesen véletlenszerű, hanem bizonyos törvényszerűséget „preferál”, vagyis azt hogy a beesési szög és a visszaverődési szög azonos – OpenGL nem a visszaverődési vektort hanem a felező vektort használja
Phong modell, spekuláris fény – Is a visszaverődő spekuláris fény intenzitása – 0 £ r s £ 1 spekuláris tükröződési konstans (felület tulajdonság) – fényesség: a • ahogy a növekszik a spekuláris tükröződés gyorsabban hal el • 1 és 1000 közötti is lehet r r a
I s = r s max(0, n × h ) Ls
– a hígulást is figyelembe kell venni
Phong megvilágítási egyenlet • Ezt az egyenletet az R, G és B komponensekre is végre kell hajtani I = Ie + Ia +
1 2
(I d + I s )
a + bd + cd r r r ra 1 I = I e + r a La C + r d max(0, n × l) Ld C + r s max(0, n × h ) Ls 2 a + bd + cd
(
)
OpenGL, interpoláció
Felületenként
Simított, interpolált
OpenGL, interpoláció
Oldalankénti normális
Pontonkénti normális
OpenGL, interpoláció • Gouraud interpoláció (OpenGL) – A Phong egyenletet pontosan kiszámoljuk a csomópontoknál (vertex) majd a poligon belsejében ezekből interpolálunk
• Phong interpoláció – A normál vektorokat pontosan meghatározzuk a csomópontoknál, majd a poligon belsejében ezekből interpolálunk – A Phong egyenletben ezeket az interpolált normál vektorokat használjuk
OpenGL megvalósítás • A megvilágításhoz 3 lépés kell – A megvilágítási és árnyékolási modell beállítása – A fényforrások definiálása – Objektum anyagának definiálása
Megvilágítási modell beállítása • glEnable(GL_LIGHTING)
– A vilá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 értékeket
interpolálja
Megvilágítási modell beállítása • glLightModelf(GLenum pname, GLfloat param) • glLightModelfv(GLenum pname, GLfloat *param) • pname – GL_LIGHT_MODEL_AMBIENT – GL_LIGHT_MODEL_LOCAL_VIEWER – GL_LIGHT_MODEL_TWO_SIDE
A fényforrások definiálása • 8 fényforrás definiálható, ezeket be kell kapcsolni glEnable(GL_LIGHT0)
• Paraméterek beállítása glLight*()
Programré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, glLigthfv(GL_LIGHT0, glLigthfv(GL_LIGHT0, glLigthfv(GL_LIGHT0,
GL_AMBIENT, amb_int); GL_DIFFUSE, oth_int); GL_SPECULAR, oth_int); GL_POSITION, pos);
// 4. komponens: alfa (több célra is)
Objektum anyagának definiálása • Poligonok oldalai külön-külön vagy egybe is megadható • glMaterialf(GLenum face, GLenum pname, GLfloat param) • face: – GL_FRONT – GL_BACK – GL_FRONT_AND_BACK
• pname: – – – – –
GL_EMISSION GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_SHININESS
További opciók • Zárt objektumok esetén a nem látható felületeket nincs értelme megrajzolni glEnable(GL_CULL_FACE) glCullFace(…) /* GL_FRONT vagy GL_BACK */
• Az árnyékoláshoz normál vektorokat kell megadni – glNormal3d(…), glNormal3f(…)
– Egység hosszú legyen vagy – OpenGL normalizálja glEnable(GL_NORMALIZE)
Példák
gomb.c
shinyjet.c
OpenGL programré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_specular[] = { 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_specular); glLightfv (GL_LIGHT0, GL_POSITION, light_position); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); }
OpenGL programrészlet void display (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); glRotatef (20.0, 1.0, 0.0, 0.0); glPushMatrix (); glTranslatef (-0.75, 0.5, 0.0); glRotatef (90.0, 1.0, 0.0, 0.0); glutSolidTorus (0.275, 0.85, 15, 15); glPopMatrix (); glPushMatrix (); glTranslatef (-0.75, -0.5, 0.0); glRotatef (270.0, 1.0, 0.0, 0.0); glutSolidCone (1.0, 2.0, 15, 15); glPopMatrix (); glPushMatrix (); glTranslatef (0.75, 0.0, -1.0); glutSolidSphere (1.0, 15, 15); glPopMatrix (); glPopMatrix (); glFlush (); }
OpenGL programrészlet
Példa Aluminium
Réz
Arany
Vörös fém
Kék műanyag
Nincs ambiens
Fehér ambiens
Színes ambiens
Irodalom •
H. Gouraud, "Continuous shading of curved surfaces," IEEE Transactions on Computers, 20(6):623–628, 1971.