| CS6620 | Advanced Graphics 2 | University of Utah | 
| Prof: Peter Shirley | Ray Tracing | Sem: Spring 2002 | 
| 
 | 
  
| Assignment 05 - Solid Texture (Marble) | 
| 
 On top of the framework I built for Assignment 04 - RGS vs. BVH Bake-Off, I've added the ability to set materials as solid textures. I did this by creating a new class called a Channel whose sole function is to provide a color output. So, for example, there is a class derived from the channel called a ChannelColor, which is simply a constant color. Derived from the Channel class is also a ChannelMarble class which instantiates a Noise class to compute octaves of noise and combines them into marble. In the scene description file, you can now attach any color component of a material (currently only ambient, diffuse and specular) to any of these channels. It looks like this in the scene file:
material "red" {
  diffuse { color < 1 0 0 > }
  }
}
which will set the diffuse component to a constant red. Here's a more complex example: 
material "marble" {
  diffuse { 
    marble { 
      scale 1
      period 1.3
      distortion 3
      octaves 12
      ramp {
        < 1.0 0.000 0.0 >
        < 1.0 0.125 0.0 >
        < 1.0 0.250 0.0 >
        < 1.0 0.375 0.0 >
        < 1.0 0.500 0.0 >
        < 1.0 0.625 0.0 >
        < 1.0 0.750 0.0 >
        < 1.0 0.875 0.0 >
      }
    } 
  }
}
which will set the diffuse channel to the marble function with the given parameters. The hope is that this organization will allow me the flexibility that I want in setting up materials. Further work will include the ability to combine several channels arithmetically, so I can get multi-pass effects, or for things such as a base diffuse color modulated by a marble procedure or an image (texture) map. Here are some quick notes about how I generate the marble texture. The function I use to compute the marble looks something like the following: abs( sin( 180 * ( period * v.x + distortion * Fractal3( v, octaves ) ) ); where v is the (possibly scaled) position at which the noise is to be computed and Fractal3 is a fractal sum of noise computed as follows: 
float n = 0.0f;
for ( int i = 0; i < octaves; i++ )
{
   float o = ( float )( 1 << i );
   n += Noise3( v * o ) / o;
}
return n;
where Noise3 is the standard Perlin Noise function. 
 (unless otherwise noted).  | 
  
All of the images above can be regenerated by specifying the appropriate 
scene file on the command line of the rayn program 
rayn-05.zip (443 Kb).  The source code is included 
in the zip file.  Here is a description of the command line parameters for 
rayn.
usage: rayn [options] <scene_file>
 required:
             <scene_file>    file containing scene description
 options:
  -o         <output_file>   output image filename (output.tga)
  -w         <width>         width of output image (256)
  -h         <height>        height of output image (256)
  -shadows   <true/false>    generate shadow rays (true)
  -rgs       <true/false>    generate regular grid subdivision (true)
  -bvh       <true/false>    generate bounding volume hierarchy (false)
  -sort      <true/false>    sort (not split) the surface list (false)
  -cull      <true/false>    cull backfacing triangles (false)
     | 
  
| Questions/comments to nate@pobox.com. | 
| 
 | 
  
| 
        March 2002  © Nate Robins  |