New Concepts The recursive ray tracing algorithm Generating eye rays Non Real-time rendering
Ray tracing Using ray tracing you can achieve photorealistic effects You can achieve many complex lighting effects, such as shadows, refraction and reflection. It is incredibly hard, if not impossible to achieve these accurate effects with the standard rendering pipeline. While you get a huge advance in visual quality, it comes with the price of very long rendering times.
Camera Rays First you shoot rays from the camera out into the scene. Pixels can be rendered in any order, but in this lab we will go from top to bottom left to right. We loop over the pixels and generate an initial primary ray (eye ray) The ray origin is just the camera’s position The direction is computed by first finding the 4 corners of a virtual image in world space, then interpolating to the correct spot, and finally computing a normalized direction from the camera to the virtual pixel.
Ray Intersection The eye ray is then tested for intersection against every object in the scene. If there is no intersection then we just color that pixel the specified ‘background’ color. If there is a hit, then we want to find out what the closest object hit was. At the intersection, we need to know the position, normal, color, texture coordinates, material etc…about that exact location. If the hit is inside a triangle, then all that information is just interpolated from the vertex data.
Lighting Once we have the key intersection information, we can apply any lighting model we want. This can include procedural shaders, lighting computations, texture lookups, bump mapping etc… Many of the most interesting forms of lighting involve spawning additional rays and tracing them recursively. (Which we will be doing in this lab for shadows) The result of the lighting equation is a color which is used to color the pixel.
Shadows Shadows are really easy to achieve Just trace another ray from a hit point to every light in the scene, if you hit an object before you hit the light, then that light cannot contribute to the color. Shadow rays only need to know if something is hit, where as normal rays need to know position, color, normal, etc. When we spawn new rays off of a surface, it is a good idea to add a bit of an offset to the origin. That is to push it up slightly (0.0001) along the normal of the surface. –This prevents the ray from intersecting with the object it spawned off of.
Reflection Rays Reflections are another awesome and easy to do effect with ray tracing. Instead of calculating the lighting equation at a particular hit point, you just trace a secondary ray, called the reflection ray, and trace it into the scene. Reflection rays, like shadow rays, should also be nudged up a bit.
Reflection Rays If the reflection ray hits a normal material, we compute the illumination and use that as the final color. But if the reflection hits another mirror, then we just recursively generate a new reflection ray and trace it. To prevent the system from getting trapped in an infinite loop, you can set a limit to the depth of the recursion. 10 is a good number…
Intersection Test For this lab, everything has been created by using triangles, so you will only have to write an intersection test for ray-triangle intersections. Once we know a ray hits a triangle at a point q we must verify that q lies inside the 3 edges of the triangle. We do this by calculating the barycentric coordinates. –q’ = q-v0 –e1 = v1 - v0 –e2 = v2- v0 –b1 = (q’ * e2)/(e1 * e2) –b2 = (q’ * e1)/(e1 * e2) –Reject if b1 1
File Overview Camera.[cpp h] : You will do most of the work in these files, including writing the actual RayTrace algorithm, and all the code for producing eye rays. Image.[cpp h] : All the functions for drawing, and setting the screen pixels. You don’t have to write any code here Light.[cpp h] : All the information for the lights. You don’t have to write any code. Model.[cpp h] : You will have to write the triangle and model intersection code here Ray.h : Has the structures for ray’s and intersections defined here Vector.h : All of the vector manipulation stuff. Scene.[cpp h] : The scene is defined in here Raytracer.cpp : this is the main file.
Requirements Complete the ray tracer so that you end up with an image that has shadows and mirror reflections. Similar to this:
Implementation Suggestions MAKE SURE YOU LOOK THROUGH ALL THE FILES AND UNDERSTAND THEM There is a TODO in every function where you need to write code. “grep TODO *” <--- type that in the terminal It helps to have a function like bool inShadow(…) You will probably have to write a function called Trace() !!! The first thing your gonna have to work on is writing the intersection functions and the eyeray generating function. Work on this every day.
Resources There are resources on the webpage. PLEASE download them, there are helpful pictures, and information on eye ray generation.