„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés

Rohamcsiga (vitalap | szerkesztései)
Rohamcsiga (vitalap | szerkesztései)
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 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 hanyad része verődik vissza.
 
** Elég nagy problémát okoz, hogy ebben a képletben a bemenet és a kimenet is hullámhossz függő. 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 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.
** Ez 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. (Én 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])
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.
**** n - törésmutató (RGB vektor)  
 
**** k - kioltási tényező (RGB vektor)
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])
**** F0 - egy az anyagra jellemző konstans
* n - törésmutató (RGB vektor)  
***** <code> F0 = ((n-1)*(n-1) + k*k) / ((n+1)*(n+1) + k*k); </code>
* k - kioltási tényező (RGB vektor)
**** theta - beesési szög
* F0 - egy az anyagra jellemző konstans.
**** F(theta) - a visszaverődő relatív intenzitást adja meg, komponensenként:
** <code> F0 = ((n-1)*(n-1) + k*k) / ((n+1)*(n+1) + k*k); </code>
***** F(theta) = F0 + (1-F0) * pow(1-cos(theta), 5)
* theta - beesési szög
<br/>
* F(theta) - a visszaverődő relatív intenzitást adja meg, komponensenként.
Pl:
** 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 + (Color(1)-F0) * pow(1-cosTheta, 5);
     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)
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]]  
 
Példaprogram: [[Média:Grafpp_raytrace_ezust.cpp‎|Ezüst]]  


http://i.imgur.com/dvA9XWq.png
http://i.imgur.com/dvA9XWq.png