„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 1 474. sor: | 1 474. sor: | ||
Példaprogram: [[Média:Grafpp_raytrace_ketiranyu_sugarkovetes.cpp|Kétirányú sugárkövetés]] | Példaprogram: [[Média:Grafpp_raytrace_ketiranyu_sugarkovetes.cpp|Kétirányú sugárkövetés]] | ||
A korábbi jelenet, csak | A korábbi jelenet, csak kétirányú (bal oldalt) és baloldalt (jobb oldalt) sugárkövetéssel, mindkét esetben 500 000 fotonnal | ||
http://i.imgur.com/ | {| | ||
|- | |||
| http://i.imgur.com/DJwySzu.jpg || http://i.imgur.com/IAJ813F.jpg | |||
|} | |||
<br/> | |||
http://i.imgur.com/ | Ennél a példaprogramnál egy kicsivel összetettebb jelentnél már rengeteget tud dobni a kétirányú sugárkövetés. Viszont ezeknél meg sokkal jobban fáj a szép árnyék hiánya. Például: | ||
http://i.imgur.com/ | |||
{| | |||
|- | |||
| http://i.imgur.com/hPu5FGv.jpg || http://i.imgur.com/nNVSlsW.jpg | |||
|} | |||
<br/> | |||
Két lehetséges megoldás a recés árnyékok problémára: | |||
* A triviális utakon is vegyük figyelembe a globális illuminációt, csak ott sokkal kisebb súllyal, úgy, hogy ott továbbra is a lokális illumináció domináljon. Például a fotonokat szorozzuk be a <code>recursion_level == 0 ? 0.25f : 1.0f</code> számmal. Ez a megoldás ingyen van, és egy picivel jobb eredményhez vezet. Ennek a hatása: | |||
http://i.imgur.com/OkgFCZh.jpg | |||
* A másik megoldás a multi-sampling használata. Itt az az ötlet, hogy minden pixelhez több képet is fényképezzünk le, és ezeket mossuk össze. Ez az megoldás ''nagyon'' drága, a beadón ezt nem illik használni viszont rengeteget javít a képminőségen és a triviálisan lehet vele mélység-élességet is implementálni. | |||
Mivel a tárgyból ezt úgy se nagyon kéne használnod, ezért csak érdekességképpen mutatom meg a legegyszerűbb multi-sampling algoritmust, ami random mintavételezést használ: | |||
<br/> <syntaxhighlight lang="c"> | |||
void takePicture() { | |||
for(int x = 0; x < Screen::height; ++x) { | |||
for(int y = 0; y < Screen::width; ++y) { | |||
Color sum; | |||
const int sample_num = 16; | |||
for(int i = 0; i < sample_num; ++i) { | |||
float x_ = x + float(rand())/RAND_MAX - 0.5f; | |||
float y_ = y + float(rand())/RAND_MAX - 0.5f; | |||
sum += capturePixel(x_, y_); | |||
} | |||
Screen::Pixel(x, y) = sum / sample_num; | |||
} | |||
} | |||
} | |||
</syntaxhighlight> <br/> | |||
Az eredménye: [[Média:Grafpp_raytrace_ketiranyu_sugarkovetes_multisample.cpp| Egy nagyon, nagyon lassú, de szép eredményt adó program]] | |||
http://i.imgur.com/hFG6KmA.jpg | |||
<br/><br/><br/><br/><br/> | |||
== A negyedik házihoz szükséges elmélet == | == A negyedik házihoz szükséges elmélet == | ||