The goal is to make a ray tracer that incorporates photon mapping in order to model lighting effects exhibited by a diamond. The base style for this demo page was copied and pasted from here. The Cornell Box data was obtained from here with slight modifications (because I didn't implement area lights)
1  Photon map  
A map of the photons stored in the scene 

2  Nearest neighbour search by kdtree  
Timing Data: Naive algorithm vs Kdtree nearest neighbour search
Suppose we have an 100x100 image (10000 pixels) and for each pixel's primary ray intersection with the scene, we need to find its 100 nearest photons. Let's vary the number of photons used in the photon map, and see how well the naive algorithm and the kdtree algorithm perform in finding the nearest neighbours: With 1000 photon casted: naive: 1.67 seconds kdtree: 0.39 seconds With 10000 photon casted: naive: 17.54 seconds kdtree: 1.60 seconds With 100000 photon casted: naive: 167.84 seconds kdtree: 20.09 seconds 

3  Filtering photons  
Each pixel is coloured according to the intensity of photons around it. Notice the diffuse reflection off the red and green walls onto the white wall. 

45  Reflection, transparency and refraction  
Spheres with increasing reflectance (0.1 to 0.5 to 0.9) 
Spheres with increasing transmittance/transparency (0.1 to 0.5 to 0.9) 

Transparent spheres with increasing indices of refraction (1.2 to 2 to 10) 
Mirror and glass spheres in the Cornell Box 

6  Additional primitives  
Cylinder, cone and torus 

7  Constructive Solid Geometry  
Unions (head and torso), differences (ears) and intersections (hands) of spheres 

8  Texture Mapping  
Aliens got tired of abducting macho cows 

9  Antialiasing by stochastic sampling  
Before antialiasing 
Pixels requiring antialiasing are highlighted in cyan 
After antialiasing 

10  Final Scenes  
Abstract NPR diamond 
Spinning "diamond" 

Actual diamond!!! Now let's see if it exhibits the hearts and arrows phenomenon 
In motion 

Top view (partial arrows) 
Spin 

Bottom view (no hearts) 
Whee 

11  Bugs I encountered  
texture gets blended in photon mapping 
some problem with local/global variables 

mirror reflection bug 
incorrect use of nearest neighbours 

this is probably not right, but I have no intuition for glass tori 
Supposed to be a metal sphere I think 

Diamond with baguette cut. This is not really a bug but I ran out of time to make it look nice. 
ahh huge bug! 