208 lines
7.6 KiB
HTML
208 lines
7.6 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>FART (FART Ain't A RayTracer)</title>
|
|
<style type="text/css">
|
|
body {
|
|
margin: 0.2em 2ex;
|
|
background-color: #DEF;
|
|
}
|
|
.link {
|
|
padding: 0.2em 0.5ex;
|
|
text-decoration: none;
|
|
border: solid 1px black;
|
|
background-color: #CCC;
|
|
color: #000;
|
|
font-weight: bold;
|
|
}
|
|
.link:hover {
|
|
background-color: #999;
|
|
}
|
|
hr { margin: 2em auto; }
|
|
tt {
|
|
display: block;
|
|
margin: 0.4em 0px;
|
|
padding: 0.1em 0.8ex;
|
|
background-color: #FFF;
|
|
border-style: dashed;
|
|
border-width: 1px;
|
|
border-color: #900;
|
|
}
|
|
img { border-style: none; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1 style="text-align:center">FART (FART Ain't A RayTracer)</h1>
|
|
<div style="text-align:center">
|
|
<a class="link" href="#description">Project Description</a>
|
|
|
|
<a class="link" href="#code">Code</a>
|
|
|
|
<a class="link" href="design.html">Design Document</a>
|
|
|
|
<a class="link" href="#screenshots">Screenshots</a>
|
|
|
|
<a class="link" href="report.html">Final Report</a>
|
|
</div>
|
|
|
|
<hr/>
|
|
<a name="description" />
|
|
<h2>Project Description</h2>
|
|
<p>
|
|
FART is my semester project for the Computer Science 658 class
|
|
at Grand Valley State University.
|
|
My goal is for FART to be a distributed, object-oriented raytracer.
|
|
The name is a
|
|
<a href="http://en.wikipedia.org/wiki/Recursive_acronym">recursive acronym</a> similar to GNU or LAME.
|
|
</p>
|
|
<p>
|
|
FART will take in a scene-description file in some sort of
|
|
ASCII-based input file format.
|
|
After the scene file is parsed, it will be raytraced (rendered)
|
|
according to the render options.
|
|
Some of these options can be specified on the command line and
|
|
others can be specified in the scene description file.
|
|
When a given option can be specified both places, the command-line
|
|
options will override what is in the scene file.
|
|
</p>
|
|
<p>
|
|
Rendering can be done using the built-in distributed algorithm.
|
|
Command-line options will be utilized to specify a "host file"
|
|
which can contain a list of hosts to use while rendering the scene.
|
|
The algorithm will be fault-tolerant so that if one of the worker
|
|
nodes goes down the work can be reorganized to complete that
|
|
section of the image.
|
|
</p>
|
|
|
|
<hr/>
|
|
<a name="code" />
|
|
<h2>Code</h2>
|
|
<p>
|
|
You can retrieve a copy of FART from my Subversion repository
|
|
using the command
|
|
<tt>svn co svn://holtrop.homelinux.com/fart/trunk fart</tt>
|
|
Build using <tt>make</tt>
|
|
and run with something like
|
|
<tt>./fart scenes/infinity.fart</tt>
|
|
</p>
|
|
|
|
<hr/>
|
|
<a name="screenshots" />
|
|
<h2>Screenshots</h2>
|
|
<div style="text-align:center">
|
|
<p>
|
|
<img src="rev_25.png" alt="rev_25" />
|
|
<br/>
|
|
Revision 25 - I can write .bmp files but I'm not doing
|
|
anything with scene data yet.
|
|
</p>
|
|
<p>
|
|
<img src="rev_43.png" alt="rev_43" />
|
|
<br/>
|
|
Revision 43 - FART can intersect a ray with a sphere
|
|
but doesn't have lighting/shading/material colors yet...
|
|
</p>
|
|
<p>
|
|
<img src="rev_45.png" alt="rev_45" />
|
|
<br/>
|
|
Revision 45 - cheap lighting based on implicit light source
|
|
at the viewpoint
|
|
</p>
|
|
<p>
|
|
<img src="rev_46.png" alt="rev_46" />
|
|
<br/>
|
|
Revision 46 - multisampling is working (back to a flatly-shaded
|
|
sphere to show the anti-aliasing effect on the edges)
|
|
</p>
|
|
<p>
|
|
<img src="rev_62.png" alt="rev_62" />
|
|
<br/>
|
|
Revision 62 - added a Plane shape type, I really need to
|
|
get some better lighting working
|
|
</p>
|
|
<p>
|
|
<img src="rev_76.png" alt="rev_76" />
|
|
<br/>
|
|
Revision 76 - Phong shading model working with
|
|
ambient, diffuse, and specular light components
|
|
</p>
|
|
<p>
|
|
<img src="rev_121.png" alt="rev_121" />
|
|
<br/>
|
|
Revision 121 - Added a Box object. No, it didn't take 45 revisions
|
|
just for that. I've been working on the parser for the scene input
|
|
files a lot as well.
|
|
</p>
|
|
<p>
|
|
<img src="rev_134.png" alt="rev_134" />
|
|
<br/>
|
|
Revision 134 - Added a Cyl object.
|
|
Cyl objects can be cones or cylinders - they have a bottom
|
|
radius, a top radius, and a height.
|
|
</p>
|
|
<p>
|
|
<img src="rev_155.png" alt="rev_155" />
|
|
<br/>
|
|
Revision 155 - Boolean intersections working.
|
|
I had to rework the way I was returning intersections to also
|
|
return a reference to the actual shape that was intersected with
|
|
so that Intersect shapes would really return the child shape that
|
|
produced the point.
|
|
</p>
|
|
<p>
|
|
<img src="rev_162.png" alt="rev_162" />
|
|
<br/>
|
|
Revision 162 - a few bug fixes, and added Union and Subtract
|
|
shape types.
|
|
</p>
|
|
<p>
|
|
<img src="rev_176.png" alt="rev_176" />
|
|
<br/>
|
|
Revision 176 - More bug fixes, and reading the scene description
|
|
from a file is finally working!
|
|
</p>
|
|
<p>
|
|
<img src="rev_180.png" alt="rev_180" />
|
|
<br/>
|
|
Revision 180 - Material definitions working
|
|
</p>
|
|
<p>
|
|
<img src="rev_187.png" alt="rev_187" />
|
|
<br/>
|
|
Revision 187 - Recursion working for transparent objects.
|
|
Rays sent from surface point to each light source now intersect
|
|
with other objects to produce shadows depending on the transparency
|
|
of the objects between the surface point and the light source.
|
|
</p>
|
|
<p>
|
|
<a href="csg.png"><img src="rev_196.png" alt="rev_196" /></a>
|
|
<br/>
|
|
Revision 196 - Added scenes/csg.fart as an example of doing
|
|
<a href="http://en.wikipedia.org/wiki/Constructive_solid_geometry">CSG</a>.
|
|
Also fixed a bug in the loading of boolean objects.
|
|
</p>
|
|
<p>
|
|
<a href="subtract-subtract.png"><img src="rev_202.png" alt="rev_202" /></a>
|
|
<br/>
|
|
Revision 202 - Changed intersection method to also return surface
|
|
normals (instead of accessing them through a separate function,
|
|
getNormalAt()).
|
|
This allowed Subtract objects to invert the normals obtained by
|
|
the sub-object being subtracted out.
|
|
This, in turn, allowed subtractions of subtractions to re-invert
|
|
them, and so on and so forth...
|
|
</p>
|
|
<p>
|
|
<a href="infinity1440.png"><img src="infinity-sm.png" alt="infinity-sm" /></a>
|
|
<br/>
|
|
Infinity
|
|
<br/>
|
|
Created from <span style="font-family: monospace;">scenes/infinity.fart</span>
|
|
</p>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|