„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
Hozzáadtam a pont fényforrás részt →Megvilágítás |
|||
| 829. sor: | 829. sor: | ||
=== Megvilágítás === | === Megvilágítás === | ||
* A hihető, valóságosnak tűnő képek hatásának kb. 90%-át a megvilágítás adja. De ahhoz, hogy ilyeneket tudjuk renderelni előbb bele kell hatolnunk a fényforrások lelki világába, és egy kis fizikára és statisztikára is szükségünk lesz. | * A hihető, valóságosnak tűnő képek hatásának kb. 90%-át a megvilágítás adja. De ahhoz, hogy ilyeneket tudjuk renderelni előbb bele kell hatolnunk a fényforrások lelki világába, és egy kis fizikára és statisztikára is szükségünk lesz. | ||
==== Az ambiens fényforrás ==== | |||
* A legegyszerűbb fényforrás, amit bevezethetünk, az a környezeti világítás. Ez a valóságban nem létezik, csak egy modell, azt hivatott utánozni, hogy nappal a tárgyaknak az a része sem teljesen fekete, amit közvetlenül nem világít meg egy fényforrás se. Ugyanis a tárgyakról a környezetében minden irányba verődik vissza fény, nem csak a szemünk irányába, és ez pl. egy szobába létrehoz egy nagyjából konstans, iránytól független háttérvilágítást. Ez a modell nagyon sok környezetben nem állja meg a helyét, pl nagy nyílt terepen, bár vannak technikák a hibáinak kiküszöbölésére, vagy helyettesítésére (SSAO, Hemisphere lighting, Light probes stb...). Ez kódban csak annyit fog jelenteni a környezeti (ambiens) fényerőt változtatás nélkül hozzáadjuk az objektum színéhez. | * A legegyszerűbb fényforrás, amit bevezethetünk, az a környezeti világítás. Ez a valóságban nem létezik, csak egy modell, azt hivatott utánozni, hogy nappal a tárgyaknak az a része sem teljesen fekete, amit közvetlenül nem világít meg egy fényforrás se. Ugyanis a tárgyakról a környezetében minden irányba verődik vissza fény, nem csak a szemünk irányába, és ez pl. egy szobába létrehoz egy nagyjából konstans, iránytól független háttérvilágítást. Ez a modell nagyon sok környezetben nem állja meg a helyét, pl nagy nyílt terepen, bár vannak technikák a hibáinak kiküszöbölésére, vagy helyettesítésére (SSAO, Hemisphere lighting, Light probes stb...). Ez kódban csak annyit fog jelenteni a környezeti (ambiens) fényerőt változtatás nélkül hozzáadjuk az objektum színéhez. | ||
==== Az irány fényforrás ==== | |||
* Egy mások fontos fényforrás az irányfényforrás. Ilyen például a Nap. A Nap olyan távol van tőlünk, hogy a szobámon belül teljesen mindegy, hogy hol helyezkedik el egy objektum, a nap mindig ugyan olyan irányból és intenzitással világítja meg. Itt viszont már az iránynak fontos szerepe van. Egy megvilágított szobában az asztal teteje sokkal világosabb, mint az asztal alja. Hogy ezt meg tudjuk valósítani, egyszerű fizikára van szükségünk. Tegyük fel, hogy egy anyagra két azonos erősségű fénysugár esik, az egyik merőlegesen, a másik theta szögben. | * Egy mások fontos fényforrás az irányfényforrás. Ilyen például a Nap. A Nap olyan távol van tőlünk, hogy a szobámon belül teljesen mindegy, hogy hol helyezkedik el egy objektum, a nap mindig ugyan olyan irányból és intenzitással világítja meg. Itt viszont már az iránynak fontos szerepe van. Egy megvilágított szobában az asztal teteje sokkal világosabb, mint az asztal alja. Hogy ezt meg tudjuk valósítani, egyszerű fizikára van szükségünk. Tegyük fel, hogy egy anyagra két azonos erősségű fénysugár esik, az egyik merőlegesen, a másik theta szögben. | ||
** Így ha a merőlegesen eső sugár átmérője egységnyi, akkor a theta szögben eső sugár esetében az a felület amin ugyan annyi energia eloszlik sokkal nagyobb. Könnyen levezethető, hogy az egységnyi felületre eső energia (azaz a megvilágítás ereje) cos(theta)-val arányos. | ** Így ha a merőlegesen eső sugár átmérője egységnyi, akkor a theta szögben eső sugár esetében az a felület amin ugyan annyi energia eloszlik sokkal nagyobb. Könnyen levezethető, hogy az egységnyi felületre eső energia (azaz a megvilágítás ereje) cos(theta)-val arányos. | ||
| 864. sor: | 866. sor: | ||
} break; | } break; | ||
case Light::Directional: { | case Light::Directional: { | ||
float intensity = max(dot(inter.normal, light.pos), 0.0f); | float intensity = max(dot(inter.normal, light.pos.normalize()), 0.0f); | ||
accum_color += intensity * light.color * own_color; | accum_color += intensity * light.color * own_color; | ||
} break; | } break; | ||
| 875. sor: | 877. sor: | ||
} | } | ||
}; | }; | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
Az eddigi elmélet összerakva egy programmá: [http://pastebin.com/ | |||
Az eddigi elmélet összerakva egy programmá: [http://pastebin.com/Qepzm3NP Kocka-tracer] | |||
<br/> | <br/> | ||
Az eredménye, összehasonlítva azzal, amit az OpenGL tud: | Az eredménye, összehasonlítva azzal, amit az OpenGL tud, ugyan olyan beállítások mellett: | ||
<br/> | <br/> | ||
<br/> | <br/> | ||
| 885. sor: | 887. sor: | ||
<div style="text-align:left;margin:0px auto;"> | <div style="text-align:left;margin:0px auto;"> | ||
http://i.imgur.com/tgmGj7A.png http://i.imgur.com/PA2A3eQ.png | http://i.imgur.com/tgmGj7A.png http://i.imgur.com/PA2A3eQ.png | ||
</div><br/> | |||
==== A pont fényforrás ==== | |||
* A pont fényforrás egy grafikában nagyon gyakran használt fényforrás, de a valóságban nem létezik. A valóságos izzóknak egyáltalán nem elhanyagolható a kiterjedése, nem pontszerűek, viszont ha pontszerűnek tekintjük őket, akkor sokkal könnyebb számolni velük. A pont fényforrás az irányfényforrástól annyiban különbözik, hogy az intenzitása és az iránya se állandó. Az intenzitásról annyit tudunk mondani, hogy bármely, a fényforrást körülvevő zárt térfogat felületén állandó (hiszen a fotonok nem vesznek el a semmibe, és nem is születnek a semmiből), így a fényforrás középpontú gömbök felületén is állandó az energia. Viszont erről a felületről tudjuk, hogy a távolság négyzetével arányos (A = 4*r^2*Pi), így az egy pontra jutó energia a távolság négyzetének reciprokával arányos. A fény iránya pedig egyszerűen a fényforrásból az megvilágítandó anyag felületi pontjába mutató egységvektor, és erre is ugyan úgy igaz a koszinuszos képlet. | |||
* A pont fényforrásnak fontos, hogy ne csak a színét adjuk meg, hanem az energiáját is, pl. egy húsz wattos zölden világító izzó "színének" adjunk meg Color(0.0f, 20.0f, 0.0f). Természetesen itt egy egység nem fog pontosan megfelelni egy wattnak, ez függ attól is, hogy a távolságot hogyan választottuk meg. | |||
* Egy lehetséges implementáció: | |||
<br/> <syntaxhighlight lang="c"> | |||
case Light::Point: { | |||
Vector pos_to_light = light.pos - inter.pos; | |||
float attenuation = pow(1/pos_to_light.length(), 2); | |||
float intensity = max(dot(inter.normal, pos_to_light.normalize()), 0.0f); | |||
accum_color += attenuation * intensity * light.color * own_color; | |||
} break; | |||
</syntaxhighlight> <br/> | |||
A kamera fölöl - fejlámpaként - világító [http://pastebin.com/i9qsbbXm pont fényforrás] hatása: | |||
<div style="text-align:left;margin:0px auto;"> | |||
http://i.imgur.com/3ZjMobS.png | |||
</div><br/> | </div><br/> | ||