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.
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.