„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 1 057. sor: | 1 057. sor: | ||
* Most azzal fogunk foglalkozni, hogy bizonyos anyagokon egy lámpa fénye meg tud csillanni, ha megfelelő irányból nézzük. Ilyen pl. egy lakkozott fa felület. Fontos megjegyezni, hogy ez nem úgy viselkedik mint egy tükör, nem látjuk rajta a tükörképünket, csak esetleg egy megcsillanó foltot. | * Most azzal fogunk foglalkozni, hogy bizonyos anyagokon egy lámpa fénye meg tud csillanni, ha megfelelő irányból nézzük. Ilyen pl. egy lakkozott fa felület. Fontos megjegyezni, hogy ez nem úgy viselkedik mint egy tükör, nem látjuk rajta a tükörképünket, csak esetleg egy megcsillanó foltot. | ||
* A viselkedésének leíráshoz meg kell értenünk, hogy ez a hatás hogy jön létre. | * A viselkedésének leíráshoz meg kell értenünk, hogy ez a hatás hogy jön létre. | ||
** A simának tűnő anyag felülete is valójában rücskös mikroszkóppal nézve. De a legtöbb anyagra igaz, hogy egy mérettartomány alatt már simának tekinthető mikro-lapokból (micro facet) épül fel. | ** A simának tűnő anyag felülete is valójában rücskös mikroszkóppal nézve. De a legtöbb anyagra igaz, hogy egy mérettartomány alatt már simának tekinthető mikro-lapokból (micro facet) épül fel. Ezek a kis lapok teljesen tükrözőnek tekinthetőek, és az anyagról a szemünkbe érkező fény, valójában a megfelelő irányba álló mikro-lapokról visszaverődő fényt jelenti. | ||
http://i.imgur.com/knD4RV4.jpg | http://i.imgur.com/knD4RV4.jpg | ||
* A mikro-lapok iránya normál-eloszlást követ. A várható értékük - nyilván - a felületi normál. A szórás viszont az anyag jellemzője, ez legyen paraméter. Ha a szórás nagyon nagy, akkor a lapok elhelyezkedése szinte teljesen véletlenszerű, és így minden irányba ugyanannyira tükrözőek, vagyis egy teljesen diffúz anyagot alkotnak. | * A mikro-lapok iránya normál-eloszlást követ. A várható értékük - nyilván - a felületi normál. A szórás viszont az anyag jellemzője, ez legyen paraméter. Ha a szórás nagyon nagy, akkor a lapok elhelyezkedése szinte teljesen véletlenszerű, és így minden irányba ugyanannyira tükrözőek, vagyis egy teljesen diffúz anyagot alkotnak. | ||
* De ha a szórás kicsi... Akkor a lapok nagyobb része fog a normál irányába elhelyezkedni, így ha olyan szögből nézzük az objektumot, hogy a fény beesési irányának és a nézeti vektornak (a szemünkből a felületi pontba mutató vektornak) az átlaga a normál közelébe van, akkor | * De ha a szórás kicsi... Akkor a lapok nagyobb része fog a normál irányába elhelyezkedni, így ha olyan szögből nézzük az objektumot, hogy a fény beesési irányának és a nézeti vektornak (a szemünkből a felületi pontba mutató vektornak) az átlaga a normál közelébe van, akkor abból az irányból nézve sokkal több fény a szemünkbe fog tükröződni, mint a többi irányból. | ||
** De mit jelent az, hogy a "közelébe"? Mennyire a közelébe? És a normál közelébe mennyivel gyengébb ez a hatás, mint pont a normálban. | ** De mit jelent az, hogy a "közelébe"? Mennyire a közelébe? És a normál közelébe mennyivel gyengébb ez a hatás, mint pont a normálban. | ||
** A lapok irányát egy harang görbe jellemzi. Hogy megtudjuk, hogy abba az irányba a lapok hányadrésze néz, ami a visszatükröződésnek kedvez, be kell helyettesítenünk a normál eloszlás sűrűségfüggvényébe. A képlet nem bonyolult, de van benne egy exponenciális függvény, aminek kiszámítása lassú. Viszont skaláris szorzattal egy koszinuszt ki tudunk számolni, ami egy picit hasonlít a haranggörbére. Ha a koszinusznak vesszük egy polinomját, pl az a*cos(x)^b, azzal nagyon jól közelíteni lehet a haranggörbét. Én ezt az ötlet fel fogom használni az implementációhoz, mert így az egy picit egyszerűbb. | ** A lapok irányát egy harang görbe jellemzi. Hogy megtudjuk, hogy abba az irányba a lapok hányadrésze néz, ami a visszatükröződésnek kedvez, be kell helyettesítenünk a normál eloszlás sűrűségfüggvényébe. A képlet nem bonyolult, de van benne egy exponenciális függvény, aminek kiszámítása lassú. Viszont skaláris szorzattal egy koszinuszt ki tudunk számolni, ami egy picit hasonlít a haranggörbére. Ha a koszinusznak vesszük egy polinomját, pl az a*cos(x)^b, azzal nagyon jól közelíteni lehet a haranggörbét. Én ezt az ötlet fel fogom használni az implementációhoz, mert így az egy picit egyszerűbb. | ||
| 1 077. sor: | 1 077. sor: | ||
* Ezt felhasználva legyen 'R' legyen a visszaverődő fény iránya, 'V' pedig a felületi pontból a szemünk felé mutató egységvektor. | * Ezt felhasználva legyen 'R' legyen a visszaverődő fény iránya, 'V' pedig a felületi pontból a szemünk felé mutató egységvektor. | ||
* A haranggörbét közelíthetjük e két vektor által bezárt szög koszinuszával is: <code>dot(R, V)</code>. Persze a negatív értékek nekünk nem jók és ennek még a polinómját is kell vennünk. A képlet így <code>specular_power = a * pow(max(0, dot(R, V)), shininess)</code>. Megjegyzés: az 'a' konstans elhagyható, az implicit benne lehet az anyagra jellemző spekuláris színben. | * A haranggörbét közelíthetjük e két vektor által bezárt szög koszinuszával is: <code>dot(R, V)</code>. Persze a negatív értékek nekünk nem jók és ennek még a polinómját is kell vennünk. A képlet így <code>specular_power = a * pow(max(0, dot(R, V)), shininess)</code>. Megjegyzés: az 'a' konstans elhagyható, az implicit benne lehet az anyagra jellemző spekuláris színben. | ||
* A spekuláris anyag egyben diffúz is. A spekuáris megcsillanás (specular_power * specular_color) hozzáadódik a diffúz színhez. | * A spekuláris anyag egyben diffúz is. A spekuáris megcsillanás (specular_power * specular_color) hozzáadódik a diffúz megvilágításból származó színhez. | ||
* Pl. irányfényforrásokra én így implementáltam. | * Pl. irányfényforrásokra én így implementáltam. | ||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||