„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 1 187. sor: | 1 187. sor: | ||
=== A valós tükröző anyagok === | === A valós tükröző anyagok === | ||
A valós tükröző anyagok, nem csak a tükrök, de pl. a fényesre csiszolt fémek is, nem viselkednek tökéletes tükörként. A különbség az, hogy ezek az anyagok nem a fény 100%-át verik vissza, hanem egy részét elnyelik (az nagyrészt hővé alakul). Az elnyelt fény mértéke a hullámhossztól is függhet, ezért pl. egy sima aranyfelület elszínezi a tükörképet. Egy fürdőszobai tükör persze minden hullámhosszon nagyjából ugyanannyi fényt nyel el. | |||
A képlet amire szükségünk lenne, az egy adott hullámhosszon a törésmutató, és a kioltási tényező függvényében megmondaná, hogy a fény hanyadrésze verődik vissza. | |||
Az, hogy bemenet és a kimenet is hullámhossz függő elég nagy problémákat okozhat. Egy lehetséges egyszerűsítés, hogy mi csak három kitüntetett színre (a pirosra a zöldre és a kékre) számoljuk ki a képlet eredményét, és ezt ezzel megszorozzuk az RGB színskálán leírt színünket. | |||
A képlet, ami ezt a jelenséget leírja közvetlenül a Maxwell-egyenletekből levezethető, bár az eredmény, a [http://hu.wikipedia.org/wiki/Fresnel-egyenletek Fresnel-egyenletek] jóval bonyolultabb, mint amit mi használni szeretnénk. Én csak a képletnek egy közelítését írom itt le, ami eltekint a polarizációtól, mert a grafikában általában ezt szokták használni. (A [http://en.wikipedia.org/wiki/Schlick%27s_approximation Schlick's approximation] kiegészített alakját alakját fogom használni, lásd pl. [http://http.developer.nvidia.com/GPUGems3/gpugems3_ch17.html GPU Gems 3]) | |||
* n - törésmutató (RGB vektor) | |||
* k - kioltási tényező (RGB vektor) | |||
* F0 - egy az anyagra jellemző konstans. | |||
** <code> F0 = ((n-1)*(n-1) + k*k) / ((n+1)*(n+1) + k*k); </code> | |||
* theta - beesési szög | |||
* F(theta) - a visszaverődő relatív intenzitást adja meg, komponensenként. | |||
** F(theta) = F0 + (1-F0) * pow(1-cos(theta), 5) | |||
Például: | |||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||
| 1 212. sor: | 1 214. sor: | ||
Color F(float cosTheta) { | Color F(float cosTheta) { | ||
return F0 + | return F0 + (1-F0) * pow(1-cosTheta, 5); | ||
} | } | ||
| 1 224. sor: | 1 226. sor: | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
Az 'n' és 'k' paraméterek az anyagra jellemzőek, általában a házi kiírásban meg vannak adva. Például ezüst esetén n = (0.14, 0.16, 0.13), k = (4.1, 2.3, 3.1) | |||
Példaprogram: [[Média:Grafpp_raytrace_ezust.cpp|Ezüst]] | |||
http://i.imgur.com/dvA9XWq.png | http://i.imgur.com/dvA9XWq.png | ||