For each point on the window, we send a 3D "ray" to that point and extend it into the scene as shown by the arrow and dotted line. Whatever this ray hits first is what is seen in that pixel. Each pixel can be computed independently by simple computations to form the image. The two main tasks of the program are determining what point on object is hit, and what color that point is. The first task will require intersecting 3D lines with surfaces such as spheres, which will require some mathematics. Determining the color will require some simple physics and the generation of rays from the intersection point to see how the world "looks" to that point.
Basic vector geometry
Monte Carlo Integration
A firm grasp of the fundamentals is hard to get, but will last a lifetime.
Starting with clean math and developing clean code is the first step.
Switch from double precision to single precision will decrease your render times on most architectures because of better cache utilization and possibly faster arithmetic operations.
Orthonormal Bases and Frames
Dynamic Length Arrays
Random Number Generator
Class Design:RGB, Image, Vector3, Orthonormal Basis, Dynamic Array, Random Number Generator.