Az informatikusok rettegett „Számítógépes grafika és képfeldolgozás” tárgyának házi feladatát megirigyelve kezdtem el írni egy sugárkövető programot. A jelentős erőforrásigény miatt az egész program abban a szellemben készült, hogy több számítógép együttes teljesítményét is kitudja használni.
A sugárkövetés egy számítógépes grafikai eljárás. Gyakorlatilag azon alapul, hogy a program megvizsgálja, a kép adott pontjára milyen színű és intenzitású fény jut el a modell fényforrásaiból a tárgyakon megtörve, visszaverődve. Mivel a programban a fénysugarak ugyanazt csinálják, mint a valóságban, ezzel a módszerrel teljesen valósághű képeket hozhatunk létre.
A sugárkövetés rekurzívan történik. A program kiválaszt egy képpontot, és a néző szemének helyzetéből és látószögéből meghatároz egy irányt, ami az adott pixelen látható. Elindul ebben az irányban és egészen addig halad, amíg nem ütközik egy tárgyba. Itt megnézi, hogy a tárgy milyen tulajdonságokkal bír a fénnyel kapcsolatban. Ha nem átlátszó és nem tükröződő, akkor egyszerű a dolog, már csak annyit kell kiszámítani, hogy a jelenet fényforrásaiból milyen színű fény jut a tárgyra. Ha tükröződik vagy törik a fény, akkor a Fresnel-egyenletek alapján meghatározható új irányban (irányokban) folytatja a program a fénysugár követését, egészen addig, míg nem tükröződő felülethez nem ér, vagy bizonyos számú törésig/tükröződésig.
Ezzel a megoldással már egész jó képek állíthatók elő, de még nem az igazi. A tükröződő és törő felületek miatt lehetnek olyan pontok, ahol a tárgyak kitakarják a fényforrásokat, de mégis jut oda fény más irányból. Azért, hogy ez így is történjen, kétirányú sugárkövetést használ a program, ami azt jelenti, hogy először a fényforrásból kilő véletlenszerű irányokban adott számú fotont, és jegyzi, hogy melyik tárgy, melyik pontjába csapódtak be. Ezáltal lesz egy foton térképünk, amit figyelembe veszünk a fenti számításoknál is.
A program három modulra osztható:
Server
A szerver vezérli az egész folyamatot. Nála van meg a teljes jelenet a benne lévő modellekkel, hozzá kapcsolódnak a különböző kliensek és a végén ő menti el a kész képet. Renderelő kliensek kapcsolódásakor elküldi nekik a jelenetet, majd azt is, hogy a kép melyik részét kell kiszámítaniuk. Az elkészült kép darabokat begyűjti, majd összeilleszti.
RenderClient
A modul elég „buta”, amint megkapta a jelenet felépítését, folyamatosan számítja ki a szerver által kért képrészleteket, amíg nem kap utasítást arra, hogy leálljon (ilyet akkor kap, ha elkészült a teljes render). Na azért mégsem annyira buta ez a programegység sem. Fel van készítve több processzormag használatára, és a folyamat kiegészül egy helyi vezérlő és egy felügyelő szállal. A vezérlő kommunikál először a szerverrel, majd adott számú folyamatot indít, az előzetesen lekért jelenettel, a felügyelő pedig ellenőrzi, hogy minden renderelő szál megfelelően működik-e.
ViewerClient
A fenti két modul konzolban működik, de azért jó lenne, ha valahol követni lehetne a kép állapotát vizuálisan is. Erre szolgál a ViewerClient, ami csatlakozik a szerverhez és mindig lekérdezi a teljes kép aktuális állapotát, amit meg is jelenít egy szép ablakban.
A képeken látható, amint éppen két szerver és egy asztali PC dolgozik egy jelenet előállításán, valamint két kész kimenet. A szerver egy webes felülettel is rendelkezik, ahol követhető a kliensek és a folyamat állapota.
További bővítési lehetőségek:
- GPU használata a renderelésre
- Térpartíciók alkalmazása a gyorsabb ütközés keresésére
- Mozgókép készítés



