„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
Hozzáadtam a spekuláris anyagok részt |
|||
| 980. sor: | 980. sor: | ||
* Eddig a képalkotáskor a színeknek a (0, 1) tartományon kívül eső részét levágtuk. Ha nagyon sok esetben nem túl valósághű eredményhez vezet. Például vegyünk két 20 W-os izzót és világítsunk meg vele egy kockát. Ez a valóságban annyira nem ritka / lehetetlen összeállítás. | * Eddig a képalkotáskor a színeknek a (0, 1) tartományon kívül eső részét levágtuk. Ha nagyon sok esetben nem túl valósághű eredményhez vezet. Például vegyünk két 20 W-os izzót és világítsunk meg vele egy kockát. Ez a valóságban annyira nem ritka / lehetetlen összeállítás. | ||
** Az eddigi módszereinkkel ez így néz ki: | ** Az eddigi módszereinkkel ez így néz ki: | ||
http://i.imgur.com/ZRgJgHx.png <br/> | |||
http://i.imgur.com/ZRgJgHx.png | |||
* A kép baloldala jól néz ki, van két egészen hihető árnyékunk. Maga a kocka is egész jó. | * A kép baloldala jól néz ki, van két egészen hihető árnyékunk. Maga a kocka is egész jó. | ||
* Viszont a képnek szinte a teljes jobb oldala kiégett, és minden ugyan olyan fehér, ordít róla, hogy mű. És ezek csak 2 db 20 W-os izzó... | * Viszont a képnek szinte a teljes jobb oldala kiégett, és minden ugyan olyan fehér, ordít róla, hogy mű. És ezek csak 2 db 20 W-os izzó... | ||
* Vegyünk két 50 W-os izzót: | * Vegyünk két 50 W-os izzót: | ||
http://i.imgur.com/z4fAqu0.png <br/> | |||
http://i.imgur.com/z4fAqu0.png | |||
* A kocka még mindig jól néz ki. Ellenben itt már árnyékok is kiégtek, és az árnyékok nagy része ugyan olyan fényes, mint az, ami közvetlenül meg van világítva. És ezek még mindig teljesen hétköznapi értékek, két db 50 W-os izzó... Ha ez nem megy, akkor a Nappal mit kezdjünk? | * A kocka még mindig jól néz ki. Ellenben itt már árnyékok is kiégtek, és az árnyékok nagy része ugyan olyan fényes, mint az, ami közvetlenül meg van világítva. És ezek még mindig teljesen hétköznapi értékek, két db 50 W-os izzó... Ha ez nem megy, akkor a Nappal mit kezdjünk? | ||
| 1 015. sor: | 1 009. sor: | ||
Bal oldalt tone map nélkül, Jobb oldalt Reinhard tonemappel. | Bal oldalt tone map nélkül, Jobb oldalt Reinhard tonemappel. | ||
http://i.imgur.com/z4fAqu0.png http://i.imgur.com/P4cANQa.png | http://i.imgur.com/z4fAqu0.png http://i.imgur.com/P4cANQa.png <br/> | ||
* Nagyon fényes képek élvezhetőségén a Reinhard operator nagyon sokat javít. | * Nagyon fényes képek élvezhetőségén a Reinhard operator nagyon sokat javít. | ||
| 1 024. sor: | 1 017. sor: | ||
Bal oldalt tonemap nélkül, Jobb oldalt Reinhard tonemap-pel. | Bal oldalt tonemap nélkül, Jobb oldalt Reinhard tonemap-pel. | ||
http://i.imgur.com/2Fp5XFB.png http://i.imgur.com/rSwo1ot.png | http://i.imgur.com/2Fp5XFB.png http://i.imgur.com/rSwo1ot.png | ||
* A Reinhard operátor a semminél jobb, de nem az igazi. | * A Reinhard operátor a semminél jobb, de nem az igazi. | ||
| 1 035. sor: | 1 028. sor: | ||
** A pontosan algoritmus lassú, és bonyolult, egy logaritmus képzésen alapul, de 3 texture lookup is van benne. | ** A pontosan algoritmus lassú, és bonyolult, egy logaritmus képzésen alapul, de 3 texture lookup is van benne. | ||
*** Jim Hejl (az EA games egyik fejlesztője) talált hozzá egy nagyon egyszerű, de meglepően pontos közelítést. | *** Jim Hejl (az EA games egyik fejlesztője) talált hozzá egy nagyon egyszerű, de meglepően pontos közelítést. | ||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||
x = max(0, InputColor-0.004); | x = max(0, InputColor-0.004); | ||
OutputColor = (x*(6.2*x+0.5))/(x*(6.2*x+1.7)+0.06); | OutputColor = (x*(6.2*x+0.5))/(x*(6.2*x+1.7)+0.06); | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
* WTF???? | * WTF???? | ||
* Ennek a "random képletnek" egy apró szépséghibája, hogy sRGB színtérbe állítja elő a színt, viszont nekünk sima RBG színt adnunk az OpenGL-nek, ezért az eredményt komponensenként 2.2-edik hatványra kell emelnünk, hogy használni tudjuk. | * Ennek a "random képletnek" egy apró szépséghibája, hogy sRGB színtérbe állítja elő a színt, viszont nekünk sima RBG színt adnunk az OpenGL-nek, ezért az eredményt komponensenként 2.2-edik hatványra kell emelnünk, hogy használni tudjuk. | ||
| 1 045. sor: | 1 040. sor: | ||
<br/> | <br/> | ||
_____ Tonemap nélküli kép ____________ Reinhard tonemap ______________ Filmic tonemap _______ | _____ Tonemap nélküli kép ____________ Reinhard tonemap ______________ Filmic tonemap _______ | ||
http://i.imgur.com/pdC31jE.png http://i.imgur.com/1dhh2lu.png http://i.imgur.com/EX4hRKs.png<br/> | http://i.imgur.com/pdC31jE.png http://i.imgur.com/1dhh2lu.png http://i.imgur.com/EX4hRKs.png<br/> | ||
http://i.imgur.com/rEABMJg.png http://i.imgur.com/o1dmQYz.png http://i.imgur.com/QBUda13.png<br/> | http://i.imgur.com/rEABMJg.png http://i.imgur.com/o1dmQYz.png http://i.imgur.com/QBUda13.png<br/> | ||
http://i.imgur.com/PDOptWq.png http://i.imgur.com/4I6eUH5.png http://i.imgur.com/qdFGAU1.png<br/> | http://i.imgur.com/PDOptWq.png http://i.imgur.com/4I6eUH5.png http://i.imgur.com/qdFGAU1.png<br/> | ||
http://i.imgur.com/Zy5ESZh.png http://i.imgur.com/vhRyuqI.png http://i.imgur.com/GKOhIq8.png<br/> | http://i.imgur.com/Zy5ESZh.png http://i.imgur.com/vhRyuqI.png http://i.imgur.com/GKOhIq8.png<br/> | ||
http://i.imgur.com/rRGFCE9.png http://i.imgur.com/fQeP0vk.png http://i.imgur.com/mR3Vmn1.png | http://i.imgur.com/rRGFCE9.png http://i.imgur.com/fQeP0vk.png http://i.imgur.com/mR3Vmn1.png<br/> | ||
* A filmic operátor a túl sötét képeket világosabbá, élvezhetőbbé teszi. | * A filmic operátor a túl sötét képeket világosabbá, élvezhetőbbé teszi. | ||
* A túl világos képeken továbbra is érződik, hogy ott világos van. | * A túl világos képeken továbbra is érződik, hogy ott világos van. | ||
| 1 057. sor: | 1 051. sor: | ||
* Csak egyszerű ALU műveleteket használ. | * Csak egyszerű ALU műveleteket használ. | ||
==== Spekulráis anyagok ==== | |||
* Az anyagok amikkel eddig dolgoztunk teljesen diffúzak voltak. | |||
* A teljesen diffúz anyag egy pontja, konstans megvilágítás mellett mindig ugyan úgy néz ki, akárhonnan, akármilyen szögből is nézzük. A valós anyagok viszont nem mind így viselkednek. | |||
* 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 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. Ez 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 | |||
* 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 a fény a szemünkbe fog tükröződni. | |||
** 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. | |||
* Először is ki kell tudnunk számolni, hogy 'N' normálvektorral rendelkező tükör merre ver vissza egy beérkező 'I' sugarat. A visszavert sugarat jelöljük 'R'-el. Azt tudjuk, hogy a három vektor egy síkban van, és a beesési szög megegyezik a visszaverődési szöggel. De mégse így fogunk számolni, egyszerű vektor műveletekkel is ki lehet fejezni. | |||
http://http.developer.nvidia.com/CgTutorial/elementLinks/fig7_3.jpg | |||
* Próbáld a visszavert sugarat csak a négy alapművelet és a skaláris szorzás segítségével kifejezni. Ha nem megy, ajánlom hogy nézd át újra a BSZ I. anyagot. | |||
* Az legegyszerűbb megoldás: | |||
<br/> <syntaxhighlight lang="c"> | |||
inline Vector reflect(Vector I, Vector N) { | |||
return I - (2.0 * dot(N, I)) * N; | |||
} | |||
</syntaxhighlight> <br/> | |||
* Ezt felhasználva 'R' legyen a visszaverődő fény, 'V' pedig a felületi pontból a szemünk felé mutató egységvektor. | |||
* Ezeket felhasználva egy megfelelő 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. | |||
* Pl. irányfényforrásokra én így implementáltam. | |||
<br/> <syntaxhighlight lang="c"> | |||
float specular_power = | |||
pow( | |||
max(0.0f, dot( | |||
reflect(-light.dir.normalize(), inter.normal), | |||
(camera.pos-inter.pos).normalize()) | |||
), shininess | |||
); | |||
accum_color += specular_power * light.color * specular_color; | |||
</syntaxhighlight> <br/> | |||
* Persze itt se feledkezzünk el az árnyékokról. Szerencsére az árnyékszámítás itt is teljesen ugyan az. | |||
* A 'shininess' meghatározása teljesen mértékben hasra-ütésre, próbálgatással szokott menni. Én személy szerint a kettő hatvány shinnines értékekkel szoktam először próbálkozni (8 - 16 - 32 - 64 a leggyakoribb nálam), és utána esetleg "finom hangolom" az értéket, az alapján, hogy mi néz ki jól. | |||
* A spekuláris megcsillanások nagyon sokat tudnak dobni egy kép hihetőségén: | |||
http://i.imgur.com/A7RhKuN.png | |||
----- | ----- | ||
[https://wiki.sch.bme.hu/Szerkeszt%C5%91:Rohamcsiga RohamCsiga] - 2014.01. | [https://wiki.sch.bme.hu/Szerkeszt%C5%91:Rohamcsiga RohamCsiga] - 2014.01. | ||