A ray tracer emits a ray from each pixel toward the scene to determine the color of the pixel, the process of computing the color can be split in three parts
- ray generation, the origin and direction of each pixel ray is computed
- ray intersection, the ray finds the closest object intersecting the viewing ray
- shading, where the intersection point, surface normal and other information is used to determine the color of the pixel
A ray can be represented with a 3D parametric line from the eye $\mathbf{e}$ to a point $\mathbf{s}$ on the image plane as
Note that
- $\mathbf{p}(0) = \mathbf{e}$
- $\mathbf{p}(1) = \mathbf{s}$
- if $0 < t_1 < t_2$ then $\mathbf{p}(t_1)$ is closer to $\mathbf{e}$ than $\mathbf{p}(t_2)$
- if $t < 0$ then $\mathbf{p}(t)$ is behind $\mathbf{e}$
Camera coordinate system
All the rays start from the origin of an orthonormal coordinate frame known as the camera/eye coordinate system, in this frame the camera is looking at the negative $\mathbf{w}$ axis
The coordinate system is built from
- the viewpoint $\mathbf{e}$ which is at the origin of the camera coordinate system
- the view direction which is $\mathbf{-w}$
- the up vector which is used to construct a basis that has $\mathbf{v}$ and $\mathbf{w}$ in the plane defined by the view direction and the up vector
Ray generation
Pixel coordinates
The image dimensions is defined with four numbers
- $l, r$, the position of the left and right edges
- $t, b$, the position of the top and bottom edges
Note that the coordinates are expressed in the camera coordinate frame defined in a plane parallel to the $w=0$ plane (the $w=0$ plane is defined by the point $\mathbf{e}$ and the vectors $\mathbf{u}$ and $\mathbf{v}$)
The image has to be fitted within a rectangle of $n_x \times n_y$ pixels, for example the pixel $(0,0)$ has the position $(l + 0.5 \tfrac{r - l}{n_x}, b + 0.5 \tfrac{t - b}{n_y})$ note that the half-pixel measurement times pixel-dimension is because of the way a pixel is defined (see rendering), a pixel with coordinates $(x, y)$ will have the position
Orthographic view
For an orthographic view all the rays will have the direction $-\mathbf{w}$, there isn’t a particular viewpoint however we can define all the rays to be emitted from the $w=0$ plane using the pixel’s image-plane position as the ray’s starting point
Perspective view
For a perspective view all the rays will have the same origin $e$ but the image-plane is not located at $w=0$ but at some distance $d$ in the $-\mathbf{w}$ direction, this time each ray will have a varying direction based on the location of the pixel’s image-plane position respect to $e$
Ray intersection
Once a ray in the form $\mathbf{e} + t\mathbf{d}$ is generated we find the first intersection with an object where $t > 0$, whenever there are many objects that intersect a ray the intersection point with the lowest $t$ is returned
The following pseudocode tests for “hits”
ray = e + td
t = infinity
for each `object` in the scene
if `object` is hit by `ray` and `ray's t` < `t`
hit object = `object`
t = `ray's t`
return hit t < infinity
Shading
Once the visible surface is known the next step is to compute the value of the pixel using a shading model, which can be made out of simple heuristics or elaborate numeric computations
A shading model is designed to capture the process of light reflection on a surface, the important variables in this process are
- $\mathbf{p}$ (intersection point) - the intersection point between a surface and a ray
- $\mathbf{l}$ (light direction) - a unit vector pointing from the surface towards a light source, computed by normalizing the vector between the intersection point $\mathbf{p}$ and the light source position $\mathbf{l_s}$
- $\mathbf{v}$ (view direction) - a unit vector pointing from the surface towards the place the ray is emitted from, it’s computed by normalizing the vector between the intersection point $\mathbf{p}$ and the ray origin $\mathbf{ray_{origin}}$
- $\mathbf{n}$ (surface normal) - a unit vector perpendicular to the surface at the point where the reflection is taking place
- other characteristics of the light source and the surface depending on the shading model
Lambertian shading
One of the simplest shading models discovered by Lambert in the 18th century, the amount of energy from a light source that falls on a surface depends on the angle of the surface to the light
- A surface facing directly the light receives maximum illumination
- A surface tangent to the light receives no illumination
- A surface facing away from the light receives no illumination
Thus the illumination is proportional to the cosine of the angle between $\mathbf{n}$ and $\mathbf{l}$ i.e. $\mathbf{n \cdot l} = \cos{\theta}$, the color of the pixel is then
Where
- $k_d$ is the diffuse coefficient, a characteristic of the surface
- $I$ is the intensity of the light source
Additional notes of this model
- The model is view independent
- The color of the surface appears to have a very matte, chalky appearance
Blinn-Phong shading
Many surfaces show some degree of highlights (shininess) or specular reflections that appear to move as the viewpoint changes, the idea is to produce reflections when $\mathbf{v}$ and $\mathbf{l}$ are positioned symmetrically across the surface normal
- the half vector $\mathbf{h}$ is a unit vector that goes through the bisector of the angle between $\mathbf{v}$ and $\mathbf{l}$
Also
- if $\mathbf{h}$ is near $\mathbf{n}$ then the specular component should be bright, if it’s far away it should be dim, therefore the illumination is proportional to the cosine of the angle between $\mathbf{n}$ and $\mathbf{h}$ i.e. $\mathbf{n \cdot h} = \cos {\theta}$
- the specular component decreases exponentially when $\mathbf{h}$ is far away from $\mathbf{n}$, therefore the result is taken to the $p$ power, $p > 1$ to make it decrease faster
The color of the pixel is then
Where
- $k_s$ is the specular coefficient, a characteristic of the surface
- $I$ is the intensity of the light source
- $p$ is a variable that controls how fast the result decreases
Note that the color of the pixel is the overall contribution of both the lambertian shading model and the blinn-phong shading model
Ambient shading
Surfaces that receive no illumination are rendered completely black, to avoid this a constant component is added to the shading model, the color depends entirely on the object hit with no dependence on the surface geometry
Where
- $k_a$ is the surface ambient coefficient
- $I_a$ is the ambient light intensity
References
- Shirley, P. and Ashikhmin, M. (2005). Fundamentals of computer graphics. Wellesley, Mass.: AK Peters.