QJuliaGPU -- Keenan Crane (kcrane@uiuc.edu, http://graphics.cs.uiuc.edu/~kcrane)
  4/17/2004


   This program ray traces the quaternion Julia set in a fragment shader
   using the sphere tracing method.  The program draws a fullscreen quad
   where each fragment of the quad specifies a different ray.  These rays
   are passed to the fragment shader which iteratively takes conservative
   steps along a ray as determined by a distance estimator for the set.  The
   rays will either stop when close to an isosurface of the distance
   function (considered a hit), or leave the bounding sphere of the Julia
   set.  If the ray is a hit, shading is performed by approximating the
   gradient of the distance function and using this as a surface normal.

   A more complete description of the sphere tracing method can be found in John Hart's paper,
   "Ray Tracing Deterministic 3-D Fractals" (http://graphics.cs.uiuc.edu/~jch/papers/rtqjs.pdf).

   Controls:

        left mouse button:    rotate view
        middle mouse button:  zoom in/out
        right mouse button:   translate view
        space:                toggle morph animation
        s:                    toggle shadows on/off
        r:                    reload shaders from disk
        i/I:                  increment/decrement 1st imaginary component of Julia set constant
        j/J:                  increment/decrement 2nd imaginary component of Julia set constant
        k/K:                  increment/decrement 3rd imaginary component of Julia set constant
        l/L:                  increment/decrement real component of Julia set constant
        -/+:                  change number of iterations used to test convergence of a point
        [/]:                  change precision of rendering

   By default the program will shift through a random constants for the
   Julia set within the cube [-1,1]^4.  Increasing the number of iterations
   or the precision will increase the amount of detail seen in the
   rendering.  The former more accurately determines whether a point is
   included in the set, whereas the latter intersects an isosurface of the
   distance function closer to the actual set.  Both of these parameters run
   into precision or computation limits when set too high.

-----------------------------------------------------------------------------------------------

   The program requires the latest version of Cg:

       http://developer.nvidia.com/object/cg_toolkit.html

   and GLUT:

       http://www.xmission.com/~nate/glut.html

   
   as well as a graphics card which supports Shader Model 3.0 (Current cards with this
   feature include the NVIDIA 6800 and 7800 series and the ATI X1800 series).  This
   program was tested on a pair of NVIDIA 7800 GTX cards in SLI.  Please let me know if
   it does not work on your system by contacting kcrane@uiuc.edu.

-----------------------------------------------------------------------------------------------
