Motivation

In this last assignment you are to implement one feature of your choice and construct two scenes of your own design. The first scene will be graded for apparent correctness. It should illustrate the feature you have implemented simply and obviously. The second scene is your opportunity to show off. In addition to rendering correctly, 10 of the 100 points for this assignment will be reserved for the "wow" factor of your second scene; that may mean your rendering is subtle and artistic, that may mean your rendering is impressive, it may even mean that your rendering is instructive. You are being asked to use judgement in addition to technical skill. For an example of well-designed scenes from previous years, see the masterwork posters outside Professor Beveridge's door.

Possible Features

Feature 1: Image texture mapping (and/or bump mapping)
Rather than having a uniform texture for each triangle or sphere, modify the material properties of a sphere or model by reading from an image file. Lecture 22 will likely be helpful if you choose this feature.
Feature 2: Procedural texture mapping (and/or bump mapping)
Similar to the last feature, this option involves modifying material properties based on spatial location. However, rather than reading from an image file, this method uses a mathematical construct such as Perlin noise to construct the material properties at each location. Perlin noise specifically was created by Ken Perlin for the original 1982 Tron movie, earning him an Academy Award for Techinical Achievement. If you choose this feature, you may find Adrian Biagioli's Understanding Perlin Noise a useful resource.
Feature 3: Thin Lens and Depth of Field
Real cameras have variable focus and that in turn means objects at one depth will be in sharp focus while objects further from the camera, or closer, will be out of focus. Traditional pinhole camera ray tracing, which we are using this semester, may be extended to generate depth of field effects using what is commonly called a 'thin lens'. Lecture 23 will likely be helpful if you choose this feature.
Feature 4: Monte Carlo Ray Tracing
As discussed in lecture 17, using stochastic methods can improve the indirect lighting of a ray tracer. Stochastic methods also allow for features that would be difficult to implement with the version of a ray tracer used in this course, such as caustics resulting from the concentration of light through through refractive objects. If you choose this feature, your Monte Carlo ray tracer should include support for at least ideal Lambertian, mirror-like, and refractive spheres. Using models is possible, but not recommended, due to the number of calculations that they add. Note: if you choose to implement a Monte Carlo ray tracer, you should seriously consider the best way to make your program efficient as you are designing it.
Feature 5: Animation
Rather than generating a single still image, you can generate a sequence of images that forms a short movie. Your animation should have at least 15 frames per second and run for at least ten seconds (so a minimum of 150 frames). There should be at least one object moving in your scene - this could be as complex as a particle model for fluid dynamics or as simple as a sphere moving across the screen. Note: if you choose to implement animation, you should seriously consider the best way to make your program efficient as you are designing it.
Feature 6: Pitch Us an Idea
If something you want to add to your ray tracer is missing above, send an email to the Instructor and GTAs and we will let you know if it is a reasonable option.

If you implement a feature that involves shooting multiple rays per pixel or you are interested in anti-aliasing, John Tsiombika's Generating multiple sample positions per pixel will be a useful resource for determining how to properly fire rays to properly achieve anti-aliasing. Anti-aliasing can be done with as few as two rays per pixel, but increasing the number of rays to something like 8 or 16 will give better results.

If you implement bump mapping in any way, make sure that you do not perturb the normals too far. Much like with smoothing, if the normals differ significantly from the "true" normals, you may encounter strange behavior with recursive calls and shadowing.

One thing to keep in mind as you design and implement your features is that there are no given drivers. As such, you are welcome to extend or modify the driver format in any way you wish.

More about Scenes

Keep in mind the goals for scene 1 and scene 2 are different.

Scene 1
Keep this scene simple. The feature you have implemented should be obvious. You must include a description of what you did and how it is apparent in this scene. This text should be part of the README file you submit with your assignment.
Scene 2
Unlike scene 1, there is no need to keep this scene simple. Instead, strive to produce a rendering you would want to show off to friends and possibly have added to the growing set of CS410 Masterworks on display outside Professor Beveridge's office. As a concession to practicality, make sure to build a scene that can be test rendered at a relatively low resolution, for example 256x256 pixels, in a reasonably short time. Then, if a high resolution (4096x4096) version is desired, it is expected rendering may take considerable time.

Submission

Submit a tar file via the CANVAS assignment page that includes:

    Driver files (driver01.txt and driver02.txt) and model files necessary to render scene 1 and scene 2.
    PPM files generated for driver01.txt and driver02.txt. The resolution of these images does not need to match the driver files - it is recommended that your driver files have relatively low resolutions so they render relatively quickly (but still high enough resolution to see what is going on) while these PPM files show your scenes in high quality.
    Your source files
    A makefile if appropriate
    README.txt file that explicitly contains (1) a command to compile your program (2) a command to execute it and (3) the description of your implemented feature.

If you are using C++, your executable should be named 'raytracer'. If your are using java, the main executable class should be named 'Raytracer'. Notice the change in case for the first letter between C++ and Java.

Reminder

There is no “late period”. It is essential to start earlier and finish earlier. The program is due when it is due. All work you submit must be your own. You may not copy code from colleagues or the web or anywhere else. Cheating will not be tolerated, and will be handled in accordance with university and department policy.