Képszintézis -casting, -tracing Szirmay-Kalos László Lokális illuminációs módszer L(, ω)=l e (,ω)+ L(h(,-ω),ω) f r (ω,, ω) cos θ dω A jobb oldali radiancia: fényforrások emissziója Fényforrások fényének egyszeri visszaverodését számítjuk L (,ω)=l e (,ω)+ L lightsource f r (ω,, ω) cos θ dω L e (y,ω ) Absztrakt fényforrás modellek: az integrálást megspórolják Ambiens fényforrás: L a constant ambiens visszaverodési modell: L ref = L a k a égbolt fény modell: L ref = L a a(, view dir) Irány fényforrások: egyetlen irányba sugároz, a fénysugarak párhuzamosak, az intenzitás független a pozíciótól Pozicionális fényforrás: egyetlen pontból sugároz, az intenzitás a távolság négyzetével csökken irány d pozicionális Lokális illumináció absztrakt fényforrásokkal Lokális illumináció Ambiens tag + ambiens tag Csak direkt megvilágítás ω l L (ω) L e (ω)+σ l r l L l (ω l ) f r (ω l,ω) cos θ l 0/: Fényforrás láthatóság Pont, irányfényforrásokból származó megvilágítás L (ω) L e (ω)+σ l r l L l (ω l ) f r (ω l,ω) cos θ l + k a L a
Lokális illuminációs algoritmusok Láthatóság a szembol (t) = eye + v t, t > 0 Láthatóság számítás a szembol Fényforrás láthatóság számítás a látható pontból A fényforrás fényének visszaverése a nézeti irányba: felületi normális FirstIntersect( t, iobject, ) t = FLT_MAX; FOR each object tnew = Intersect(, object ); // < 0 if no intersection IF (tnew > 0 && tnew < t ) t = tnew, iobject = object IF (t < FLT_MAX) = eye + v t; RETURN (t, iobject, ); RETURN no intersection END Metszéspont számítás gömbbel Kvadratikus felületek r R center r - center = R Kvadratikus felület: [,y,z,] A y = 0 z Másodfokú egyenlet Nincs gyök gyök gyök (t) - center = R (v v) t + ((eye-center) v) t +((eye-center) (eye-center))- R = 0 Wanted: minimum pozitív megoldás Felületi normális: ((t) - center)/r Ellipszoid Végtelen kúp + + y z -=0 + y - z =0 a b c a b Végtelen henger + y - =0 a b Metszéspont számítás: háromszög r r r. Síkmetszés: ((t) - r) n = 0, t > 0 normál: n = (r - r) (r3 - r). A metszéspont a háromszögön belül van-e? ((r - r) (p - r)) n > 0 Felületi normális: n ((r3 - r) (p - r)) n > 0 vagy shading normals ((r - r3) (p - r3)) n > 0 p r3 N 3 Árnyaló normálok N N N = A X + B Y+ C N = A X + B Y + C N = A X + B Y + C N 3 = A X 3 + B Y 3 + C N (X, Y, Z ) A, B, C 3 változós lineáris egyenletrendszer
Parametrikus felületek Transzformált objektumok r(u,v), u,v in [0,] (t) = eye + v t, t > 0 r(u,v) = (t) r(0.5,0) r(0,0) r(0,0.5) r(0,) T T - Egyenlet megoldás: u,v,t r(,0) r(0.5,0.5) Teszt: 0< u,v <, t > 0 r(,) Rekurzív tesszelláció T T - CSG modellek Ray-casting képek Különbség: Lokális illumináció gömb tégla Reguláris halmazmuvelet a szakaszokra: valós ido Lokális illumináció + árnyékok 0. sec sec Sugárkövetés Tört sugár Tükör sugár Árnyék sugár L(ω) = L e (ω)+σ l r l L l (ω l ) f r (ω l,ω) cos θ l + k a L a + + k r L in (ω r ) + k t L in (ω t ) L l Sugárkövetés lépései A szembe a irányából érkezo sugársuruség Adott irányba látható felületi pont és normálvektor A felületi pontból látható fényforrások A felületi pontban a tükör és törési irány A tükör irányból érkezo sugársuruség A törési irányból érkezo sugársuruség Rekurzió Az árnyalási egyenlet kiértékelése Tükör irányból érkezo fény Törési irányból érkezo fény
Sugárkövetés (Ray ( Ray-- tracing tracing)) Trace függvény Color Trace( ) IF (FirstIntersect( ð object, )>0 ) RETURN La color = Le (, -.dir) color += Direct Lightsource(, -.dir) IF ( kr > 0 ) THEN ReflectDir(, reflected ) color += kr Trace( reflected ) IF ( kt > 0 && RefractDir(, refracted ) ) color += kt Trace( refracted ) p Render( ) for each p Ray r = ( eye ð p ) color = Trace() RGB = ToneMapping(color) WritePiel(p, RGB) endfor end p RGB Trace függvény Color Trace(, d) IF d > dma THEN RETURN L a IF (FirstIntersect( ð object, ) > 0) RETURN La color = Le (, -.dir) color += Direct Lightsource(, -.dir) IF ( kr > 0 ) THEN ReflectDir(, reflected ) color += kr Trace( reflected, d+ ) IF ( kt > 0 && RefractDir(, refracted ) ) color += kt Trace( refracted, d+ ) Material Le, kd, ks, shine kr, kt, n BRDF ReflectDir RefractDir Object Primitive Scene La Define Render FirstIntersect DirectLightsource Trace(Ray ) DirectLightsource DirectLightsource(, vdir ) color = ka La árnyék FOR each lightsource l DO shadow = to lightsource[l] t = FirstIntersect( shadow ); IF (t < 0 t > - lightsource[l].pos ) color += Brdf(ldir,, vdir) cos θ l ' lightsource[l].intensity Ray--tracer osztálydiagram Ray transform Primitive( ) eredmény Light Le, pos Dir(Point) Intens(Point) Camera Sphere Mesh Center, radius vertices[ ] XRES, YRES vrp, vpn, vup eye, ww, wh Ray GetXRes( ) GetYRes( ) GetRay(int,int) Dir Start dir, start Számítási ido Pielszám Objektumszám (Fényforrás szám+)
Befoglaló térfogat (Bounding Volume) Térpartícionáló módszerek objektumok Elofeldolgozás Sugár követés doubleintersectbv(, object ) // < 0 ha nincs IF ( Intersect(, bounding volume of object) < 0) RETURN -; RETURN Intersect(, object ); END Térpartícionáló adatstruktúra Adatstruktúra: Ha ismert a sugár, akkor a potenciális metszett objektumok számát csökkenti Ha a potenciálisak közül találunk egyet, akkor a többi nem lehet közelebb Elso metszéspont Reguláris térháló Elofeldolgozás: Minden cellára a metszett objektumok kompleitás: O(n c) = O(n ) FOR each cell of the line // line drawing átlagos eset kompleitás: O( ) Nyolcas (oktális) fa 3 Octree 3 3 Faépítés( cella ): IF a cellában kevés objektum van cellában regisztráld az objektumokat ELSE cellafelezés: c, c,, c8 Faépítés(c); Faépítés(c8); FOR összes sugár által metszett cellára Binary Space Partitioning fa (kd-fa) Példa animáció 3 3 kd-tree Faépítés( cella ): IF a cellában kevés objektum van cellában regisztráld az objektumokat ELSE sík keresés cella felezés a síkkal: c, c Faépítés(c); Faépítés(c); FOR each cell intersecting the line