Home | What is Raytracing? | Raytracing Algorithm | Raytracing Reference | How to write a Raytracer | Links | Humour | About Me

# Raytracing algorithm

Raytracing is, in many ways, a standardized technique. Almost all raytracing programs (known as "raytracers") use the same basic algorithm in one way or the other. This algorithm is presented below.

## The Pre-Rendering Section

This section is executed before the actual rendering of the scene takes place. It is the most implementation and programmer dependent of all the sections of the algorithm. Its structure and content relies entirely on how the programmer has chosen to describe and store his scene and what variables need to be initialized for the program to run properly. Some parts that are usually present in some form or the other include generation of efficiency structures, initialization of the output device, setting up various global variables etc. No standard algorithm exists for this section.

## The Main Rendering Loop

This section actually produces the picture of the 3-D scene. The algorithm for this section is given below. Note that the procedure RayTrace is recursive, that is, it calls itself.

```Procedure RenderPicture()
For each pixel on the screen,
Generate a ray R from the viewing position through the point on the view
plane corresponding to this pixel.
Call the procedure RayTrace() with the arguments R and 0
Plot the pixel in the colour value returned by RayTrace()
Next pixel
End Procedure
```
```Procedure RayTrace(ray R, integer Depth) returns colour
Set the numerical variable Dis to a maximum value
Set the object pointer Obj to null
For each object in the scene
Calculate the distance (from the starting point of R) of the nearest
intersection of R with the object in the forward direction
If this distance is less than Dis
Update Dis to this distance
Set Obj to point to this object
End if
Next object
If Obj is not null
Set the position variable Pt to the nearest intersection point of R and Obj
Set the total colour C to black
For each light source in the scene
For each object in the scene
If this object blocks the light coming from the light source to Pt
Attenuate the intensity of the received light by the transmittivity
of the object
End if
Next object
Calculate the perceived colour of Obj at Pt due to this light source
using the value of the attenuated light intensity
Add this colour value to C
Next light source
If Depth is less than a maximum value
Generate two rays Refl and Refr in the reflected and refracted directions,
starting from Pt
Call RayTrace with arguments Refl and Depth + 1
Add (the return value * reflectivity of Obj) to C
Call RayTrace with arguments Refr and Depth + 1
Add (the return value * transmittivity of Obj) to C
End if
Else
Set the total colour C to the background colour
End if
Return C
End Procedure
```

## The Post-Rendering Section

This section is also more or less programmer dependent, but the functions performed usually fall into one or more of the following groups

• Memory cleanup: The space taken up for the scene and rendering data is released.

• Applying post-process filters: Special effects such as blur, edge highlighting, suppression of colour channels, gamma correction etc may be added to the picture after the actual rendering has taken place. Antialiasing, motion blur etc are usually a part of the main rendering section.

• Freeing output devices: If the output device is a file, it is closed. If it is a hardware device, then any link established with it may be suspended.

• Displaying statistics and other user data: This is, of course, entirely up to the programmer. But it is useful to know the details of the rendering process.