ray tracing cpts 548 advanced computer graphics. why write a ray tracer? more elegant than polygon...
TRANSCRIPT
Ray TracingRay Tracing
CptS 548
Advanced Computer Graphics
Why Write a Ray Tracer?Why Write a Ray Tracer?
• More elegant than polygon scan conversion
• Testbed for numerous techniques and effects– modeling– rendering– texturing
• Easiest photorealistic renderer to implement
OverviewOverview
• Vector arithmetic
• Lookat viewing coordinates
• Ray casting
• Shadows
• Reflection
• Refraction
Homogeneous CoordinatesHomogeneous Coordinates
• Point: o = (xo, yo, zo, 1)
• Direction: d= (xd, yd, zd, 0)
• Points translate, directions do not
• Homogeneous coordinate always 0 or 1
• No perspective transformation
• Ray: r = (o,d) = ((xo, yo, zo,1),(xd, yd, zd,0))
• Ray direction d always unit length
o
dr
Dot ProductDot Product
• a · b = dot(a,b) = xa xb + ya yb + za zb
• Cosine of angle between a and bif both unit length
• Used to “cast a shadow” of one unit vector onto another
a
b
(a·b) a
Cross ProductCross Product
• a b = cross(a,b)= (ya zb - za yb, za xb - xa zb, xa yb - ya xb, 0)
• Returns direction perp. to plane of a, b
• Used to set up coordinate systems
ab
c = a b
c a
Eye LUV CoordinatesEye LUV Coordinates
lookat
eye
l
up u
v
l = (lookat - eye)/||(lookat - eye)||v = (l up)/||(l up)||u = v l
Pixels in World CoordinatesPixels in World Coordinates
eye
dl
-av
-u
ll
ll = eye + dl - av - u
aspect ratio a = w/h
focal length d = 1/tan(fovy/2)
fovy
Casting Rays through PixelsCasting Rays through Pixels
for (j = 0; j < VRES; j++) {for (i = 0; i < HRES; i++) {
p = ll + 2av (double)i/HRES + 2u (double)j/VRES;d = (p - eye)/||p - eye||;r = (eye,d);color = TraceRay(r);plot(i,j,color);
}}
TraceRay AttributesTraceRay Attributes
• Invoked with ray parameter– Better if object database is global– Best if TraceRay is a member function of object
database object (yikes)
• Returns a color vector (R,G,B,) indicates transparency– color = foreground + (1- ) background
Object HierarchyObject HierarchyObject
intersects()TraceRay()
Primitive
normal()
HitObject
thitn
shade()
Composite
Sphere
Polygon
Patch
List
CSG
TraceRay DefinitionTraceRay Definition
Color TraceRay(Ray r, int depth) {HitObject ho;color c = background;if (intersects(r,ho)) {
c = ho.shade(lights); /* casts a shadow ray */c += ho.ks*TraceRay(ho.reflect(r), depth-1);c += ho.kr*TraceRay(ho.refract(r), depth-1);
}return c;
}
List DefinitionList Definitionclass List : public Composite {
Object item[100];int n;boolean intersects(Ray r, HitObject &ho) {
min_t = 1.e20;for (i = 0; i < n; i++)
if (item[i].intersects(r,o) && o.t < min_t) {min_t = o.t; ho = o;
}combine_shade(ho);return (min_t < 1.e20);
}}
shade Definitionshade DefinitionColor shade(Lights lights) {
Color c = ka;for (l = 0; l < lights.n; l++) {
ldir = normalized(lights[l].pos - hit);if (!intersects(ray(hit,ldir))) c += kd*cd*dot(n, ldir) + …
}return(c);
}
reflect Definitionreflect Definition
r.d bounce
o.n
Ray reflect(Ray r) {Ray bounce;bounce.o = hit;bounce.d = 2.0*dot(n,-r.d)*n + r.d;return(bounce);
}
Calculating RefractionCalculating RefractionSnell’s Law: i sin i = t sin t
Let =i /t = sin t / sin i
t = sin t m - cos t n
m = (cos i n - i) / sin i
= (sin t / sin i) (cos i n - i) - cos t n
cos i n - i
i
n
-n
i
t t
m
= ( cos i - cos t )n - i
itt 222 sin1sin1cos
ininint ))(1(1)( 22
refract Definitionrefract Definition
Ray refract(Ray r) {Ray t;double ni = dot(n,-r.d);eta = current_index/new_index;t.o = hit;t.d =(eta*ni - sqrt(1.0 - eta*eta*(1-ni*ni)))*n + eta*r.d;return(t);
}
ininint ))(1(1)( 22
Ray-Object IntersectionRay-Object Intersection
• intersects() member function of Object class
• Called with ray and hitobject
• Intersects ray with this object
• Returns intersection data in hitobject– t - parameter, hit - location, n - normal– new - cannot be static because of recursion– always primitive, never composite
Intersection ComputationIntersection Computation
• Parametric ray: r(t) = o + t d– t 0– If ||d|| = 1, t is distance along ray
• Implicit object: f(x) = 0
• Intersection occurs when f(r(t)) = 0– Real function of one real variable– Intersection root finding
Sphere ObjectSphere Object
class Sphere : public Primitive {Point c;double r;boolean intersects(Ray r, HitObject ho);
}
cr
Sphere IntersectionSphere Intersectionf(x)=(x - c)(x - c) - r2
f(r(t)) = (o + t d - c)(o + t d - c) - r2
= dd t2 + 2 (o-c)d t + (o-c)(o-c) - r2
A = dd = 1B = 2 (o-c)dC = (o-c)(o-c) - r2
A
ACBBt
2
42
D = B*B - 4*C;if (D < 0.0) return FALSE;rootD = sqrt(D);t0 = 0.5*(-B - rootD);t1 = 0.5*(-B + rootD);if (t0 >= 0) t = t0, return TRUE;if (t1 >= 0) t = t1, return TRUE;return FALSE;
Other HitObject ValuesOther HitObject Values
hit = r.o + t*r.d
n = hit - c
Ellipsoid IntersectionEllipsoid Intersection
f(x) = 0 f(T-1x)=0
Let T be a 4x4 transformationT distorts a sphere into an ellipsoid
f(T-1r(t))= f(T-1(o + t d))= f(T-1o + t T-1d))
Ellipsoid is implicit surface of f(T-1x)
Ellipsoid::intersects(r,&ho) {Ray Tir = (Ti * o, Ti * d);Sphere::intersects(Tir,ho);
}
o
d
T-1o
T-1d
T
xT-1x
What about the normal?What about the normal?
f(x) = 0 f(T-1x)=0T
Txx
n is tangent plane [a b c d]x is point [x y z 1]T
Such that matrix product n x = 0
n
(n Q) Tx = 0What is Q?Q = T-1
(n T-1) Tx = n (T-1 T)x = 0
New normal n’ = n T-1 = (T-1)T nT
n’
Intersecting QuadricsIntersecting Quadrics
• Just like sphere: x2 + y2 + z2 - r2
• Cylinder?– x2 + y2 - r2
• Cone?– x2 + y2 - z2
• Variations?– Use the 4x4 transformation trick
Constructive Solid GeometryConstructive Solid Geometry
• Construct shapes from primitives using boolean set operations
• Union: A+B?– A or B
• Intersection: A*B?– A and B
• Difference: A - B?– A and not B
CSG IntersectionsCSG Intersections
• List of t-values– for left object L– for right object R
• Assume ray originates outside object– t = 0 means ray originates inside object
• Traverse both lists in increasing t order
• Roth Table determine resulting t-values
Accelerating Ray TracingAccelerating Ray Tracing
• Q: Why is ray tracing so slow?
• A: It intersects every ray with every object
• Q: How can we make ray tracing faster?
• A: Coherence– Image coherence - neighboring pixel, same obj.– Spatial coherence - neighboring pt., same obj.– Temporal coherence - next frame, same image
Shadow CachingShadow Caching
• Neighboring points in a shadow are probably shadowed by the same object
• Start shadow ray intersection search with object intersected in last shadow search
Bounding VolumeBounding Volume
Cartman contains 100,000 polygons
Ray-Cartman intersection = 100,000 ray-poly intersections
Even if the ray misses Cartman
Solution:Place a sphere around Cartman
If ray misses sphere then ray misses Cartman
Bounding Volume HierarchiesBounding Volume Hierarchies
GridsGrids
• 3-D array of lists• Ray intersected with
all objects in a given cell
• Cells visited in Bresenham order
Tagging the ObjectTagging the Object
• Intersection test for entire object
• Not just portion of object in grid cell
• Only intersect object once
• Cache temporary intersection info in object
Other Partitioning StructuresOther Partitioning Structures
• Octree– Ray can parse through large empty areas– Requires less space– Subdivision takes time
• Binary Space Partition (BSP) Tree– Trees more balanced– Partitioning more flexible -> shallower trees– Added ray-plane intersections
Saving the PictureSaving the Picture
• Windows– PrtSc key
• Copies current window
• Paste into any app
• Save as any file type
– Libraries• libtiff, etc.
• Unix– xwd
• saves a window
• as an xwd file
• convert to any format
– xv• grabs a window
• save as any format
– Libraries
Submitting the PictureSubmitting the Picture
• Format– JPEG 100% uncompressed– Don’t want compression artifacts– Might be mistaken for bugs
• Web page– ~you/public_html/cs319– small compressed version– link to full-size uncompressed version
Submitting the CodeSubmitting the Code
• E-mail [email protected]
• Attach– compressed tar file– zip/gzip archive
• Contents– source code (+headers)– makefile– scene description files