„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 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 globális (bal oldalt) és kétirányú (jobb oldalt) sugárkövetéssel, mindkét esetben 500 000 fotonnal
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/IAJ813F.jpg http://i.imgur.com/DJwySzu.jpg
{|
|-
| http://i.imgur.com/DJwySzu.jpg || http://i.imgur.com/IAJ813F.jpg
|}


A spekuláris hatás, kétirányú sugárkövetéssel:
<br/>


http://i.imgur.com/U0KlYK2.png
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/KNv62oC.png <br/><br/><br/><br/><br/>
 
{|
|-
| 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 ==