„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)
Hozzáadtam a tökéletes tükör részt
1 093. sor: 1 093. sor:
* A [http://pastebin.com/0iLMiBJL spekuláris megcsillanások] nagyon sokat tudnak dobni egy kép hihetőségén:
* A [http://pastebin.com/0iLMiBJL spekuláris megcsillanások] nagyon sokat tudnak dobni egy kép hihetőségén:
http://i.imgur.com/me1hGMY.png
http://i.imgur.com/me1hGMY.png
=== A tökéletes tükör ===
* A mikroszkopikus tükrök figyelembevételével a fényforrások fénye tükröződni tud. De mi van a valódi tükrökkel? Amikben más objektumok képeit is látjuk, nem csak a fényforrások hatását?
* Sugárkövetéssel ilyen tükröket renderelni meglepően egyszerű. Az egyetlen dolog amit a tükör tulajdonságú anyag csinál a modellünkbe az az, hogy a tükröződés irányába továbblövi a sugarat.
* Implementálni ezt nagyon egyszerű, pl.:
<br/> <syntaxhighlight lang="c">
Color getColor(Intersection inter, const Light* lgts, size_t lgt_num) {
  Ray reflected_ray;
  reflected_ray.direction = reflect(inter.ray.direction, inter.normal);
  reflected_ray.origin = inter.pos + 1e-3*reflected_ray.direction;
  return scene.shootRay(reflected_ray);
}
</syntaxhighlight> <br/>
* Az egyetlen kényelmetlenséget az okozhatja, hogy ha az eddig használt adatstruktúránk nem tárolta, hogy milyen irányból érkezett a sugár, mert az nyilván kell ahhoz, hogy tudjuk, hogy melyik irányba verődik vissza.
* Pl ha padló anyagát lecserélem egy tükörre, akkor az eredmény így néz ki:
http://i.imgur.com/jDLtIv8.png
* Ez valóban egy tükör, de elég valószerűtlennek tűnik. Tényleg így nézne ki egy tökéletes tükör?
* A probléma az, hogy a tükrön semmi nyoma nem látszódik annak, hogy bármiféle fényforrás is lenne a közelbe, a kockán viszont igen.
* Egy korábbi képen a diffúz padlóról spekuláris hatás következtében a padló megcsillant, a fényforrást a mikrotükrökön keresztül láttuk. De egy tényleges tükrön keresztül már nem? Hogy is van ez?
* A probléma az, hogy egy pontszerű - nem létező - fényforrás hatását nézzük egy tökéletesen sima - szintén nem létező - anyagon egy nem túl valóságos modellel.
** A pontszerű fényforrást, ahogy a lebegőben lebeg, eddig se láttuk, mert túl kicsi a terjedése. Csak azt látjuk, ahogy hatással van más anyagokra. Ha tökéletes tükrön keresztül nézzük a fényforrást, akkor pont ugyanazt látjuk, mint ha direktbe ránéznénk: semmit.
** Ennek a problémának a megoldása nem tartozik a tárgy anyagába, de nagyon érdekes, ezért én mondanék róla pár szót.
** Annak ellenére, hogy a fényforrás túl pici, hogy egy egész pixel színét meg tudja változtatni, a szemünkben lejátszódó folyamatok miatt mégis látnunk kéne azt. Például ha Napba nézünk akkor annak az alkotott kép sokkal nagyobb részére van hatása, mint amekkora térszög alatt ténylegesen látjuk a Napot, ugyanis az "elvakít minket", a keletkező képen a Nap közelében lévő rész is sokkal világosabb lesz.
*** Ezt viszont nehéz korrekten implementálni. Ha direktbe nézünk a fényforrásra, akkor még viszonylag könnyű dolgunk van, egyszerűen ki tudjuk számolni, hogy az ernyő mely részén látszódna a pont fényforrás, és a környezetének a fényességét is megnöveljük egy kicsit. Viszont amikor egy tükrön keresztül nézzük a fényforrást, ott már nagyon trükköznünk kell. Ha meg a fényforrás fénye három tükröző és két törő anyagon keresztül jut el a szemünkbe, akkor semmi esélyünk sincs ezt a hatást implementálni.
*** A fényforrás direkt láthatóságára egy megoldás lehet még, hogy egy apró, nagyon világos gömböt rajzolunk köré. Ez tükrön keresztül is látszódik, de muszáj implementálni azt, hogy a környezete is világosabb lesz a képnek, mert enélkül hülyén fog kinézni. És arra is érdemes gondolni, hogy ez alapjaiba borítja fel az árnyékszámító algoritmusunk működését.
*** Esetleg megoldás lehet, hogy nem teljesen tökéletes tükröt feltételezünk. Persze ha a feladat kiköti, hogy tökéletesen tükröző anyagokkal dolgozz, akkor ez nem opció. Ilyenkor ugyanis fellép a spekuláris hatás, ami orvosolja a problémánkat. Viszont ilyenkor direktbe nem lesz látható a fény, ami zavaró tud lenni. A direkt láthatóságot viszont csak valamilyen más módszerrel tudjuk elérni, de ilyenkor gondot szokott okozni, hogy a két módszer konzisztens legyen, vagyis hogy direktbe és tükörből nézve is ugyan akkora és ugyan olyan fényes fényforrást lássunk.
* Egy apró probléma még akad ezzel... Mi van, ha két tükröt rakunk egymással szembe? A sugár a végtelenségig fog pattogni a kettő között? Nem egészen. Ugyanis ez egy rekurzív algoritmus, ahol a függvényhívásoknak a stackbe is lesz nyoma, ahol viszont a hely előbb utóbb elfogy, és ilyenkor a programunk megáll.
** A sugárkövető függvényünkbe követnünk kell, hogy ez hanyadik függvényhívás volt, és ha ez a szám, meghalad valamilyen értéket, pl. 8-at, akkor a sugarat már ne lőjük tovább.
* [http://pastebin.com/28U44wt6 Két szembelévő tükör] hatása:
http://i.imgur.com/5EcYwj6.png
-----
-----
[https://wiki.sch.bme.hu/Szerkeszt%C5%91:Rohamcsiga RohamCsiga] - 2014.01.
[https://wiki.sch.bme.hu/Szerkeszt%C5%91:Rohamcsiga RohamCsiga] - 2014.01.