Sugárkövetés:Sugárkövetés:ray-casting, ray-tracingray-casting, ray-tracing
Szirmay-Kalos László
KépszintézisKépszintézis
pixel
Lokális illuminációs módszerLokális illuminációs módszer
A jobb oldali radiancia:– fényforrások emissziója
Fényforrások fényének egyszeri visszaverődését számítjuk
L (x,)=Le(x,)+Llightsource fr (’,x,) cos ’d’
Le(y,’)
L(x,)=Le(x,)+L(h(x,-,) fr (’,x,) cos ’d’
Absztrakt fényforrás modellek: Absztrakt fényforrás modellek: az integrálást megspóroljákaz integrálást megspórolják
Ambiens fényforrás: La constant
– ambiens visszaverődési modell: Lref = La ka
– konstans égbolt fény modell: Lref = La a(x, 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 pozicionális
d
Lokális illumináció absztrakt Lokális illumináció absztrakt fényforrásokkalfényforrásokkal
pixel
L () Le()+lrlLl (’l) fr (’l ,) cos ’l
Pont, irányfényforrásokból származó megvilágítás
Csak direkt megvilágítás
0/1: Fényforrás láthatóság
’l
Ambiens tagAmbiens tag
L () Le()+lrlLl (’l) fr (’l ,) cos ’l + ka La
Lokális illumináció + ambiens tag
Lokális illuminációs algoritmusokLokális illuminációs algoritmusok
pixel
Láthatóság számítás a szemből 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
Sugár egyenlete
• Szakasz egyenlete
• Félegyenes egyenleter(t) = (1-t)*r0 + t*r1 ; 0 < t < 1
0 < tr(t) = r0 + t*(r1 - r0); 0 < t
r0 ból r1bemutató vektor
(a sugár iránya)(normalizálatlan)
sugár kezdőpontja
r(t) = e + t*d; 0 < t
Láthatóság a szembőlLáthatóság a szembőlpixel
ray(t) = eye + v ·t, t > 0
FirstIntersect(ray t, iobject, x) t = FLT_MAX; FOR each object
tnew = Intersect( ray, object ); // < 0 if no intersectionIF (tnew > 0 && tnew < t ) t = tnew, iobject = object
ENDFOR IF (t < FLT_MAX) x = eye + v ·t; RETURN (t, iobject, x); RETURN „no intersection”END
Metszéspont számítás gömbbelMetszéspont számítás gömbbel
|ray(t) - center |2 = R2
Felületi normális: (ray(t) - center)/R
centerR
|r - center |2 = R2
r
(v ·v) t 2 + 2 ((eye-center) ·v) t +((eye-center) ·(eye-center))- R2 = 0
Wanted: minimum pozitív megoldás
Nincs gyök 1 gyök 2 gyök
+ + -1=0
Kvadratikus felületekKvadratikus felületekxyz1
[x,y,z,1] A = 0Kvadratikus felület: Másodfokúegyenlet
Ellipszoid x2 y2 z2
a2 b2 c2 + - z2 =0
Végtelen kúp x2 y2
a2 b2
Végtelen henger x2 y2
a2 b2 + - 1 =0
Példa: sugár metszéspontja kvadratikus felülettel
• Felület egyenlete legyen
• Ugyanez mátrixformában3x2 + 2xy + z2 + 2z - 7 = 0
3 2 0 00 0 0 00 0 1 20 0 0 -7
x y z 1
xyz1
= 0
Sugár egyenlete
• A sugár kezdőpontja legyen E = [0 1 0] és az iránya D = [1 1 0]
• Írjuk vissza ebbe:
x(t) = ex + dxt = 0 + 1t = ty(t) = ey + dyt = 1 + 1t = 1 + tz(t) = ez + dzt = 0 + 0t = 0
3x2 + 2xy + z2 + 2z - 7 = 03*t*t + 2*t*(1+t) + 0*0 + 2*0 - 7 = 03t2 + 2t2 + 2t -7 = 05t2 + 2t - 7 = 0t = [-2√(2*2 - 4*5*(-7))] /(2*5) =[-2√144]/10 = [-212]/10; t1= -1.4, t2 = 1
másodfokú egyenlet(-b √(b2-4ac))/2a
ebből a legkisebbpozitív t=1
Metszéspont
• Sugár egyenletébe t=1
• A metszéspont [1 2 0]ban van
x(t) = ex + dxt = 0 + 1t = t = 1y(t) = ey + dyt = 1 + 1t = 1 + t = 2z(t) = ez + dzt = 0 + 0t = 0 = 0
Ugyanez a számítás mátrixműveletekkel
3 2 0 00 0 0 00 0 1 20 0 0 -7
x y z 1
xyz1
= 0
X XTA
XAXT = 0
X(t) = E + tD
sugáregyenlet kezdőpont irány
a 4edik mindig legyen 1Eh = 1, Dh = 0
Behelyettesíve(E+tD)A(E+tD)T = 0
Matrixszorzás linearis művelet:(összeg szorzata a szorzatok összege)
EA(E+tD)T + tDA(E+tD)T = 0EAET + tEADT + tDAET + t2DADT = 0DADT t2 + (EADT+ DAET) t + EAET = 0
a felület mátrixából, és a sugár kezdőpontjábólés irányából számítható együtthatók
másodfokú egyenlet t-re
DADT t2 + (EADT+ DAET) t + EAET = 0
DADT = = = 5
EADT = = = 0
DAET = = = 2
EAET = = = -7
A konkrét példában
3 2 0 00 0 0 00 0 1 20 0 0 -7
1 1 0 01100
3 2 0 00 0 0 00 0 1 20 0 0 -7
0 1 0 11100
3 2 0 00 0 0 00 0 1 20 0 0 -7
1 1 0 00101
3 2 0 00 0 0 00 0 1 20 0 0 -7
0 1 0 10101
3 2 0 01100
0 0 0 -71100
3 2 0 00101
0 0 0 -70101 5t2 + 2t - 7 = 0
Metszéspont számítás: Metszéspont számítás: háromszögháromszög
1. Síkmetszés: (ray(t) - r1) ·n = 0, t > 0normál: n = (r2 - r1) x (r3 - r1)
2. A metszéspont a háromszögön belül van-e?((r2 - r1) x (p - r1)) ·n > 0 ((r3 - r2) x (p - r2)) ·n > 0 ((r1 - r3) x (p - r3)) ·n > 0
r1 r1 r2
p
r3
Felületi normális: nvagy „shading normals”
Példa: hsz-sugár metszéspont
• Sugár kezdőpont [0 2 0], irány [0 0 1]• Háromszög csúcsai:
– [0 3 2], [1 1 1], [-1 2 1]• Hsz síkjának egyenlete
– normál– síkegyenet
– egyik csúcsot [1 1 1] beírva kapjuk Dt
n = ([1 1 1] - [0 3 2])×([-1 2 1] - [0 3 2]) =[1 -2 -1]×[-1 -1 -1] = [1 2 -3]
Ax + By + Cz + D = 0x + 2y - 3z + D = 0
1 + 2 - 3 + D = 0; D = 0; x + 2y - 3z = 0
Sík-sugár metszéspont
• Sík• Sugár
• Sugár beírva a síkba
• Metszéspont (t vissza a sugáregyenletbe)
x + 2y - 3z = 0
x = 0 + 0t = 0y = 2 + 0t = 2z = 0 + 1t = t
0 + 2 - 3t = 0t = 2/3
[0 2 2/3]
Benne van-e a hszben((r2 - r1) x (p - r1)) ·n > 0 ((r3 - r2) x (p - r2)) ·n > 0 ((r1 - r3) x (p - r3)) ·n > 0
[0 3 2], [1 1 1], [-1 2 1]
[1 -2 -1]×[-1 1 -1/3] = [5/3 4/3 -1][5/3 4/3 -1]·[1 2 -3] = 5/3 + 8/3 + 3 > 0
stb…ha mind igaz, a pont bent van a hszbenha nem, a sugár nem metszi a hszt
[0 2 2/3]
Árnyaló normálokÁrnyaló normálok
N1N2
N3
N
N = A X + B Y + C
(X1 , Y1 , Z1 )
N1 = A X1 + B Y1 + CN2 = A X2 + B Y2 + CN3 = A X3 + B Y3 + C
3 változóslineáris egyenletrendszer
A, B, C
Parametrikus felületekParametrikus felületekr(u,v), u,v in [0,1]ray(t) = eye + v ·t, t > 0
r(u,v) = ray(t)
Egyenlet megoldás:u,v,t
Teszt:0< u,v < 1, t > 0 Rekurzív tesszelláció
r(0.5,0.5)
r(0,0)
r(0,1)
r(1,1)
r(1,0)
r(0,0.5)r(0.5,0)
Transzformált objektumokTranszformált objektumok
T1
T2
T1-1
T2 -1
CSG modellekCSG modellekKülönbség:
gömb
tégla
Reguláris halmazműveleta szakaszokra:
Ray-casting képekRay-casting képek
Lokálisillumináció
valós idő
Lokálisillumináció+árnyékok0.1 sec …1 sec
SugárkövetésSugárkövetés
LlÁrnyék sugár
Tükör sugár
Tört sugár
L() = Le()+lrlLl (’l) fr (’l ,) cos ’l + ka La
+ + kr Lin (r) + kt Lin(t)Tükör irányból érkező
fényTörési irányból érkező
fény
Sugárkövetés lépéseiSugárkövetés lépései
A szembe a pixel irányából érkező sugársűrűsé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 érkező sugársűrűség– A törési irányból érkező sugársűrűség– Az árnyalási egyenlet kiértékelése Rekurzió
Render( ) for each pixel p
Ray r = ray( eye pixel p ) color = Trace(ray)
RGB = ToneMapping(color)WritePixel(p, RGB)
endforend
ray
RGB
p
p
Sugárkövetés (Ray-tracing)Sugárkövetés (Ray-tracing)
Sugárkövetés: Trace függvénySugárkövetés: Trace függvényColor Trace( ray ) IF (FirstIntersect(ray object, x)>0 )
RETURN La
ENDIF color = Le (x, -ray.dir) color += Direct Lightsource(x, -ray.dir) IF ( kr > 0 ) THEN
ReflectDir( ray, reflected ray)color += kr · Trace( reflected ray )
ENDIF IF ( kt > 0 && RefractDir( ray, refracted ray ) )
color += kt · Trace( refracted ray ) ENDIFRETURN color
ray
x
Sugárkövetés: Trace függvénySugárkövetés: Trace függvényColor Trace( ray, d) IF d > dmax THEN RETURN La
IF (FirstIntersect(ray object, x) > 0) RETURN La
ENDIF color = Le (x, -ray.dir) color += Direct Lightsource(x, -ray.dir) IF ( kr > 0 ) THEN
ReflectDir( ray, reflected ray)color += kr · Trace( reflected ray, d+1 )
ENDIF IF ( kt > 0 && RefractDir( ray, refracted ray ) )
color += kt · Trace( refracted ray, d+1 ) ENDIFRETURN color
ray
x
DirectLightsourceDirectLightsourceDirectLightsource( x, vdir ) color = ka La
FOR each lightsource l DOshadowray = x to lightsource[l]t = FirstIntersect( shadowray );IF (t < 0 || t > |x - lightsource[l].pos|) color += Brdf(ldir, x, vdir) cos l' lightsource[l].IntensityENDIF
ENDFORRETURN color
árnyék
pixel
x
Ray-tracer Ray-tracer osztálydiagramosztálydiagram
SceneObject
Sphere Mesh
Primitive( )
Intersect(Ray)Normal(Point)
Intersect(Ray)Normal(Point)
DefineRenderFirstIntersectDirectLightsourceTrace(Ray)
Light
Dir(Point)Intens(Point)
Latransform Le, pos
CameraXRES, YRESvrp, vpn, vupeye, ww, wh
GetXRes( )GetYRes( )GetRay(int,int)
Ray
DirStart
dir, start
MaterialLe, kd, ks, shine kr, kt, n
BRDFReflectDirRefractDir
Center, radius vertices[ ]
Primitive
Intersect(Ray)Normal(Point)
Sugárkövetés: eredménySugárkövetés: eredmény
Számítási idő Pixelszám x Objektumszám x (Fényforrás szám+1)
Befoglaló térfogat Befoglaló térfogat (Bounding Volume)(Bounding Volume)
double IntersectBV( ray, object ) // < 0 ha nincs IF ( Intersect( ray, bounding volume of object) < 0) RETURN -1; RETURN Intersect( ray, object );END
Térpartícionáló módszerekTérpartícionáló módszerek
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
Elő-feldolgozás
objektumok
Térpartícionálóadatstruktúra
Sugárkövetés
Elsőmetszéspont
Sugárkövetés: FOR each cell of the line // line drawing
Metszés a cellában lévőkkelIF van metszés RETURN
ENDFOR
átlagos eset komplexitás: O(1 )
Reguláris térhálóReguláris térhálóElőfeldolgozás: Minden cellára a metszett objektumok
komplexitás: O(n ·c ) = O(n 2)
Cellák bejárására algoritmusNyilvántartjuk, mely t sugárparaméternél lépjük át a
következő x,y,z irányú cellahatároló síkot, (Cx, Cy, Cz) a cellaméret
– kezdetben változás
Ix = Ex / Cx
Tx = (Ix+1)Cx/Dx
ebben a cellábanvagyunk
ennél a t értéknéllépünk
Ix += 1
Tx += Cx/Dx
Tx, Ty, Tz; kiválasztjuk a legkisebbetfrissítjük I-t és T-t
Sugárkövetés: FOR összes sugár által metszett cellára
Metszés a cellában lévőkkelIF van metszés RETURN
ENDFOR
Nyolcas (oktális) faNyolcas (oktális) faFaépítés( cella ): IF a cellában kevés objektum van
cellában regisztráld az objektumokat ELSE
cellafelezés: c1, c2, …, c8Faépítés(c1); … Faépítés(c8);
ENDIF
2
1 3
Octree
12
3 3
Binary Space Partitioning fa (kd-fa)Binary Space Partitioning fa (kd-fa)Faépítés( cella ): IF a cellában kevés objektum van
cellában regisztráld az objektumokat ELSE
sík kereséscella felezés a síkkal: c1, c2Faépítés(c1); Faépítés(c2);
ENDIFSugárkövetés: FOR each cell intersecting the line
Metszés a cellában lévőkkelIF van metszés RETURN
ENDFORkd-tree
2
1 3
12 3
Top Related