<<

Reading

Foley et al., 16.12

Optional: Tracing • Glassner, An introduction to , Academic Press, Chapter 1. • T. Whitted. “An improved illumination model for shaded display”. Communications of the ACM 23(6), 343-349, 1980.

2

Geometric Forward Ray Tracing We will take the view of geometric optics • Rays emanate from sources and bounce around in the scene. • Rays that pass through the projection plane and enter the eye • Light is a flow of with . We'll call contribute to the final image. these flows ``light rays.'' • Light rays travel in straight lines in free space. • Light rays do not interfere with each other as they cross. • Light rays obey the laws of and . • Light rays travel form the light sources to the eye, but the physics is invariant under path reversal (reciprocity).

• What’s wrong with this method?

3 4 Eye vs. Light Whitted ray-tracing algorithm • Starting at the light (a.k.a. forward ray tracing, 1. For each , trace a primary ray to the first visible tracing) surface 2. For each intersection trace secondary rays: – Shadow rays in directions Li to light sources – Reflected ray in direction R – Refracted ray (transmitted ray) in direction T

• Starting at the eye (a.k.a. backward ray tracing)

5 6

Reflection Refraction • Reflected light from objects behaves like from light sources – Reflectivity is just specular color – Reflected light comes from direction of perfect specular reflection

• Amount to transmit determined by transparency coefficient, which we store explicitly • T comes from Snell’s law η θη= θ i sin(it ) sin( t)

7 8

• Is this model reasonable? Total Internal Reflection Index of Refraction • When passing from a dense medium to a less dense • Real-world index of refraction is a complicated physical property of medium, light is bent further away from the surface the material • Eventually, it can bend right past the surface! θ θ •The i that causes t to exceed 90 degrees is called the θ θ critical angle ( c). For i greater than the critical angle, no light is transmitted. • A check for TIR falls out of the construction of T

θ c

• IOR also varies with , and even ! • How can we account for wavelength dependence when ray tracing?

9 10

Stages of Whitted ray-tracing Example of Ray Tracing

11 12 The Ray Tree

If I(P0, u) is the seen from point P along direction u =+ + IP(,)0 u Idirect I reflected I transmitted where

Idirect = Shade(N, L, u, R) (e.g. model) = IkIPreflected r (,R ) = IkIPtransmitted t (,)T

Typically, we set kr = ks and kt = 1 – ks .

13 14

Parts of a Ray Tracer Outer Loop • What major components make up the core of a ray tracer? – Outer loop sends primary rays into the scene – Trace arbitrary ray and compute its color contribution as it travels void traceImage (scene) through the scene { for each pixel (i,j) in the image { – Shading model ns p = pixelToWorld(i,j) IkkI=++ fdIk() (NL ⋅+⋅ )++ k ( VR ) c = COP e aa∑ iili d s i u = (p - c)/||p – c|| I(i,j) = traceRay (scene, c, u)

} }

15 16 Trace Pseudocode TraceRay Pseudocode color traceRay(point P , direction u ) 0 function traceRay(scene, P0, u) { { ← (t, P, N, obj) scene.intersect (P0, u) (P,Oi) = intersect( P0, u); I = shade( u, N, scene ) I = 0 R = reflectDirection( u, N ) for each light source l { ← ∗ I I + obj.kr traceRay(scene, P, R) A (P’, LightObj) = intersect(P, dir(P,l)) if ray is entering object { if LightObj = l { ← (ni, nt) (index_of_air, obj.index) I = I + I(l) } else { obj } (n , n ) ← (obj.index, index_of_air) } O i t l j } I = I + Obj.Kr * traceRay(P, R) if (notTIR ( u, N, n ,n ) { I = I + Obj.Kt * traceRay(P, T) i t T = refractDirection ( u, N, n ,n ) return I i t ← ∗ } I I + obj.kt traceRay(scene, P, T) } return I 17 18 }

Controlling Tree Depth Shading Pseudocode • Ideally, we’d spawn child rays at every object intersection function shade(obj, scene, P, N, u) { forever, getting a “perfect” color for the primary ray. ← I obj.ke + obj. ka * scene->Ia • In practice, we need heuristics for bounding the depth of for each light source A { the tree (i.e., recursion depth) atten = distanceAttenuation(A, P) * •? shadowAttenuation(A, Scene, P) I ← I + atten*(diffuse term + spec term) } return I } A

obj

19 20 Shadow attenuation pseudocode Ray-Object Intersection • Must define different intersection routine for each Computing a shadow can be as simple as checking to see if a ray makes it to the light source. primitive For a point light source: • The bottleneck of the ray tracer, so make it fast! function shadowAttenuation(A, scene, P) { • Most general formulation: find all roots of a function of d = (A.position - P).normalize() one variable (t, P , N, obj) ← scene.intersect(P, d) l • In practice, many optimized intersection tests exist (see if P is before the light source { l Glassner) atten = 0 } else { A atten = 1 } obj return atten } Q: What if there are transparent objects along a path to the light source? 21 22

Object hierarchies and Ray-Sphere Intersection ray intersection How do we intersect with primitives transformed with affine transformations?

vx  v vX' = y −1 vz  0

• Given a sphere centered at Pc =[0,0,0] with radius r and a Px ray P(t) = P + tu, find the intersection(s) of P(t) with the 0 P sphere. P' = y X−1 Pz  23 1 24 Numerical Error Fast Failure • Floating-point roundoff can add up in a ray tracer, and • We can greatly speed up ray-object intersection by identifying cheap create unwanted artifacts tests that guarantee failure • Example: if origin of ray is outside sphere and ray points away from – Example: intersection point calculated to be ever-so-slightly inside sphere, fail immediately. the intersecting object. How does this affect child rays? • Solutions: – Perturb child rays – Use global ray epsilon

25 26 • Many other fast failure conditions are possible!

Ray-Polymesh Intersection Goodies

• There are some advanced ray tracing feature that self- respecting ray tracers shouldn’t be caught without: – Acceleration techniques – Antialiasing –CSG – Distribution ray tracing

1. Use bounding sphere for fast failure 2. Test only front-facing polygons 3. Intersect ray with each polygon’s supporting plane 4. Use a point-in-polygon test 5. Intersection point is smallest t

27 28 Acceleration Techniques Hierarchical Bounding Volumes • Problem: ray-object intersection is very expensive – make intersection tests faster – do fewer tests

Intersect with largest The intersect with children

Eventually, intersect with primitives • Arrange scene into a tree – Interior nodes contain primitives with very simple intersection tests (e.g., spheres). Each node’s volume contains all objects in subtree – Leaf nodes contain original geometry • Like BSP trees, the potential benefits are big but the hierarchy is hard to build 29 30

Spatial Subdivision Antialiasing • So far, we have traced one ray through each pixel in the final image. Is this an adequate description of the contents of the pixel?

Uniform subdivision Quadtree in 2D • This quantization through inadequate sampling is a form of aliasing. Aliasing is visible as “jaggies” in the ray-traced image. • We really need to colour the pixel based on the average Uniform subdivision Octree colour of the square it defines. in 3D • Divide up space and record what objects are in each cell • Trace ray through array

31 32 Aliasing Supersampling • We can approximate the average colour of a pixel’s area by firing multiple rays and averaging the result.

33 34

Adaptive Sampling CSG • Uniform supersampling can be wasteful if large parts of the pixel don’t • CSG (constructive solid geometry) is an incredibly powerful way to change much. create complex scenes from simple primitives. • So we can subdivide regions of the pixel’s area only when the image changes in that area:

• How do we decide when to subdivide? • CSG is a modeling technique; basically, we only need to modify ray- object intersection. 35 36 CSG Implementation Distribution Ray Tracing • CSG intersections can be analyzed using “Roth diagrams”. • Usually known as “”, but it has nothing to do – Maintain description of all intersections of ray with primitive with distributed computing – Functions to combine Roth diagrams under CSG operations • General idea: instead of firing one ray, fire multiple rays in a jittered grid

• Distributing over different dimensions gives different effects • An elegant and extremely slow system • Example: what if we distribute rays over pixel area?

37 38

Noise DRT pseudocode traceImage() looks basically the same, except now each pixel records the average color of jittered sub-pixel rays.

function traceImage (scene): for each pixel (i, j) in image do I(i, j) ← 0 for each sub-pixel id in (i,j) do s ← pixelToWorld(jitter(i, j, id)) p ← COP u ←(s - p).normalize() I(i, j) ← I(i, j) + traceRay(scene, p, u, id) end for I(i, j) Å I(i, j)/numSubPixels end for •Noise can be thought of as randomness added to the signal. end function •The eye is relatively insensitive to noise. •A typical choice is numSubPixels = 4*4.

39 40 DRT pseudocode (cont’d) Pre-sampling glossy reflections •Now consider traceRay(), modified to handle (only) opaque glossy surfaces: function traceRay(scene, p, u, id): (q, N, obj) ← intersect (scene, p, u) I ← shade(…) R ← jitteredReflectDirection(N, -u, id) ← ∗ I I + obj.kr traceRay(scene, q, R, id) return I end function

41 42

Distributing Reflections Distributing • Distributing rays over • Distributing rays over transmission direction gives: reflection direction gives:

43 44 Distributing Over Light Area Distributing Over Aperature • Distributing over light • We can fake distribution through a by choosing a area gives: point on a finite aperature and tracing through the “in- focus point”.

• What does this simulate?

45 46

Distributing Over Time • We can endow models with velocity vectors and distribute rays over time. this gives:

47 48 Chaining the ray id’s

• In general, you can trace rays through a scene and keep track of their id’s to handle all of these effects:

49