Notes:

1.) There is only one light at position [0.0, 10.0, 0.0].

2.) The camera is positionable and is currently at position [-2.0, 2.0, 5.0].

3.) The smaller balls are randomized, so you can reload the page and get different positions, materials, and colors every time.

4.) Currently, the anti-aliasing is only set to 10, so it doesn't take forever to load, but the outlines look smoother.

5.) Since GLSL can't do recursion, refractions will properly show up on reflections, but reflections will only show up as the base material color on refractions. Also, a reflection of a reflection will just show up as the base material color. Same with a refraction on a refraction.