home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / DOS / GRAFISCH / RAYTRACE / POLYRAY / ADDENDUM next >
Text File  |  1993-04-24  |  16KB  |  402 lines

  1. Last minute additions...
  2.  
  3. After getting the documents into shape for v1.5, I made several bug fixes and
  4. additions to make v1.6.  Rather than fix up the full document file (which will
  5. be done before the next release), this addendum file is provided to give
  6. information about the changes. The new features are:
  7.  
  8.    Depth mapped lights
  9.    Depth rendering (to save Z-Buffer information)
  10.    Displacement surfaces
  11.    Raw triangle vertex output
  12.    Directional light sources
  13.    Global haze
  14.    UV mapping and bounds
  15.    Hicolor display (VESA only, may not work right for you)
  16.    Texture maps and indexed textures
  17.    Summed textures
  18.    UV triangles
  19.    Static variables
  20.    Color maps in special surfaces
  21.  
  22. I) Depth mapped lights and depth rendering
  23.  
  24. Depth mapped lights are very similar to spotlights, in the sense that they
  25. point from one location and at another information.  The primary use for these
  26. is for doing shadowing in scan converted scenes where shadow information
  27. might not be possible using the raytracer (see displacement surfaces). The
  28. format of their declaration is:
  29.  
  30.    depthmapped_light {
  31.       [ angle fexper ]
  32.       [ aspect fexper ]
  33.       [ at vexper ]
  34.       [ color expression ]
  35.       [ depth "depthfile.tga" ]
  36.       [ from vexper ]
  37.       [ hither fexper ]
  38.       [ up vexper ]
  39.       }
  40.  
  41. You may notice that the format of the declaration is very similar to the
  42. viewpoint declaration.  This is intentional, as you will usually generate
  43. the depth information for "depthfile.tga" as the output of a run of Polyray.
  44. To support output of depth information, a new statements was added to the
  45. viewpoint declaration.  The declaration to output a depth file would have the
  46. form:
  47.  
  48.    viewpoint {
  49.       from [ location of depth mapped light ]
  50.       at [ location the light is pointed at ]
  51.       ...
  52.       image_format 1
  53.       }
  54.  
  55. Where the final statement tells Polyray to output depth information instead of
  56. color information.  Note that if the value in the image_format statement is
  57. 0, then normal rendering will occur.  For an example of using a depth mapped
  58. light, see the file "room1.pi" in the data archives.
  59.  
  60. II) Displacement Surfaces
  61.  
  62. Displacement surfaces cause modification of the shape of an object as it
  63. is being rendered.  The amount and direction of the displacement are specified
  64. by an object modifier statement:
  65.  
  66.    displace vexper
  67.  
  68. Where the expression is a vector that tells Polyray how to do the displacement.
  69. This feature only works for scan converted images.  The raytracer will only
  70. see the undistorted surface.  For some examples of displacement surface, see
  71. the following files in the data archives:
  72.  
  73.    disp2.pi, disp3.pi, legen.pi, spikes.pi
  74.    
  75. III) Raw triangle vertex information
  76.  
  77. A somewhat odd addition to the image output formats for Polyray is the
  78. generation of raw triangle information.  What happens is very similar to the
  79. scan conversion process, but rather than draw polygons, Polyray will write
  80. a text description of the polygons (after splitting them into triangles).  The
  81. final output is a (usually long) list of lines, each line describing a single
  82. smooth triangle.  The format of the output is:
  83.  
  84. x1 y1 z1 x2 y2 z2 x3 y3 z3 nx1 ny1 nz1 nx2 ny2 nz2 nx3 ny3 nz3 u1 v1 u2 v2 u3 v3
  85.  
  86. The locations of the three vertices come first, the normal information for
  87. each of the vertices follows.  Lastly the uv values for each triangle are
  88. generated based on the surface you are rendering (see uv triangles below).
  89. Currently I don't have any applications for this output. The intent of this
  90. feature is to provide a way to build models in polygon form for conversion to
  91. another renderers' input format.
  92.  
  93. For example, to produce raw triangle output describing a sphere, and dump it
  94. to a file you could use the command:
  95.  
  96.    polyray sphere.pi -p z > sphere.tri
  97.  
  98. IV) Directional lights
  99.  
  100. The directional light means just that, light coming from some direction.  The
  101. biggest difference between this light source and the others is that no shadowing
  102. is performed.  This has pretty serious implications for shading, so if you
  103. use this type of light, you should also set the global shading flags so that
  104. surfaces are one-sided.  i.e. polyray foo.pi -q 55.  The format of the
  105. expression is:
  106.  
  107.    directional_light color, direction
  108.    directional_light direction
  109.  
  110. An example would be: directional_light <2, 3, -4>, giving a white light coming
  111. from the right, above, and behind the origin.
  112.  
  113. V) Global Haze
  114.  
  115. The global haze is a color that is added based on how far the ray travled before
  116. hitting the surface.  The format of the expression is:
  117.  
  118.    haze coeff, starting_distance, color
  119.  
  120. The color you use should almost always be the same as the background color.
  121. The only time it would be different is if you are trying to put haze into a
  122. valley, with a clear sky above (this is a tough trick, but looks nice).  A 
  123. example would be:
  124.  
  125.    haze 0.8, 3, midnight_blue
  126.  
  127. The value of the coeff ranges from 0 to 1, with values closer to 0 causing
  128. the haze to thicken, and values closer to 1 causing the haze to thin out.
  129. I know it seems backwards, but it is working and I don't want to break anything.
  130.  
  131. VI) UV mapping and bounds
  132.  
  133. In addition to the runtime variables x, y, P, etc.  the variables u and v
  134. have been added.  In general u varies from 0 to 1 as you go around an object
  135. and v varies from 0 to one as you go from the bottom to the top of an object.
  136. Not all primitives set meaningful values for u and v, those that do are:
  137.  
  138.    bezier, cone, cylinder, disc, sphere, torus, patch
  139.  
  140. These variables can be used in a couple of ways, to tell Polyray to only
  141. render portions of a surface within certain uv bounds, or they can be used
  142. as arguments to expressions in textures or displacement functions.
  143.  
  144. See the file uvtst.pi in the data archives for an example of using uv bounds
  145. on objects.  The file spikes.pi demonstrates using uv as variables in a
  146. displacement surface.  The file bezier1.pi demonstrates using uv as variables
  147. to stretch an image over the surface of a bezier patch.
  148.  
  149. VII) Hicolor display output
  150.  
  151. Polyray will support the VESA 640x480 hicolor graphics mode for display preview.
  152. The command line switch is "-V 2".  In polyray.ini, you would use
  153. "display hicolor".  Note that using any of the status display options can
  154. really screw up the picture.  I recommend "-t 0" if you are going to use
  155. this option.
  156.  
  157. Future versions will work better.  I just got a board that could handle hicolor,
  158. so I'm still experimenting.
  159.  
  160. VIII) Texture maps and indexed textures
  161.  
  162. A texture map is declared in a manner similar to color maps.  There is a
  163. list of value pairs and texture pairs, for example:
  164.  
  165.    define index_tex_map
  166.       texture_map([-2, 0, red_blue_check, bumpy_green],
  167.           [0, 2, bumpy_green, reflective_blue])
  168.  
  169. Note that for texture maps there is a required comma separating each of the
  170. entries.
  171.  
  172. These texture maps are complimentary to the indexed texture.  Two typical
  173. uses of indexed textures are to use solid texturing functions to select
  174. (and optinally blend) between complete textures rather than just colors, and
  175. to use image maps as a way to map textures to a surface.
  176.  
  177. For example, using the texture map above on a sphere can be done accomplished
  178. with the following:
  179.  
  180. object {
  181.    sphere <0, 0, 0>, 2
  182.    texture { indexed x, index_tex_map }
  183.    }
  184.  
  185. The indexed texture uses a lookup function (in this case a simple gradient
  186. along the x axis) to select from the texture map that follows.  See the
  187. data file "indexed1.pi" for the complete example.
  188.  
  189. As an example of using an image map to place textures on a surface, the
  190. following example uses several textures, selected by the color values in
  191. an image map.  The function "indexed_map" returns the color index value from
  192. a color mapped Targa image (or uses the red channel in a raw Targa).
  193.  
  194.    object {
  195.       sphere <0, 0, 0>, 1
  196.       texture {
  197.      indexed indexed_map(image("txmap.tga"), <x, 0, y>, 1),
  198.          texture_map([1, 1, mirror, mirror],
  199.                  [2, 2, bright_pink, bright_pink],
  200.                  [3, 3, Jade, Jade])
  201.      translate <-0.5, -0.5, 0> // center image
  202.      }
  203.       }
  204.  
  205. In this example, the image is oriented in the x-y plane and centered on the
  206. origin.  The only difference between a "indexed_map" and a "planar_imagemap"
  207. is that the first (indexed_map) returns the index of the color in the image
  208. and the second returns the color itself.  Note that the texture map shown
  209. above has holes in it (between the integer values), however this isn't a
  210. problem as the indexed_map function will only produce integers.
  211.  
  212. IX) Summed textures
  213.  
  214. Summed textures simply add weighted amounts of a number of textures together
  215. to make the final color.  The syntax is:
  216.  
  217.    texture {
  218.       summed f1, tex1, f2, tex2, ...
  219.       }
  220.  
  221. The expressions f1, f2, ... are numeric expressions.  The expressions tex1, ...
  222. are textures.
  223.  
  224. X) UV triangles
  225.  
  226. In order to keep up with the competition, it is possible to assign "uv"
  227. coordinates to triangular patches.  The syntax looks like this:
  228.  
  229.    object {
  230.       patch <x0, y0, z0>, <nx0, ny0, nz0> uv 0, 0
  231.             <x1, y1, z1>, <nx1, ny1, nz1> uv 0, 1
  232.             <x2, y2, z2>, <nx2, ny2, nz2> uv 1, 0
  233.       }
  234.  
  235. During texturing, if you use either "u" or "v" in an expression, it will be
  236. set to the appropriate value based on where the ray hit the triangle.  Note
  237. that by default the uv values are as shown above.  They may however be set
  238. to anything at all.  You may also mix uv declarations of vertices with ones
  239. that do not have uv values.  For example, the declaration:
  240.  
  241.       patch <0, 0, 0>, <0, 1, 0> uv 0.5, 0.5
  242.             <1, 0, 0>, <0, 1, 0>
  243.             <0.5, 0, 1>, <0, 1, 0>
  244.  
  245. is exactly the same as:
  246.  
  247.       patch <0, 0, 0>, <0, 1, 0> uv 0.5, 0.5
  248.             <1, 0, 0>, <0, 1, 0> uv 1, 0
  249.             <0.5, 0, 1>, <0, 1, 0> uv 0, 1
  250.  
  251. This feature is especially powerful when you have a large object made of
  252. triangles that you want to wrap an image map onto.  By defining a texture
  253. like:
  254.  
  255.       define texture mytex
  256.       texture { matte { color planar_imagemap(image("foo.tga"), <u, 0, v>)) } }
  257.  
  258. And then using "mytex" in each patch object, you can get the image properly
  259. placed.
  260.  
  261. XI) static variables
  262.  
  263. At the request of Jeff Bowermaster, I added a way to retain variable values
  264. from frame to frame of an animation.  Instead of the normal declaration of
  265. a variable:
  266.  
  267.    define xyz 32 * frame
  268.  
  269. you would do something like this:
  270.  
  271.    if (frame == start_frame)
  272.       static define xyz 42
  273.    else
  274.       static define xyz (xyz + 0.1)
  275.  
  276. The big differences between a "static define" and a "define" are that the static
  277. will be retained from frame to frame, and the static actually replaces any
  278. previous definitions rather than simply overloading them.
  279.  
  280. The static variables have an additional use beyond simple arithmetic on
  281. variables.  By defining something that takes a lot of processing at parse time
  282. (like height fields and image maps), you can make them static in the first
  283. frame and simply instantiate them every frame after that.
  284.  
  285. One example of this would be to spin a complex height field, if you have to
  286. create it every frame, there is a many second long wait while Polyray generates
  287. the field.  The following declarations would be a better way:
  288.  
  289.    if (frame == start_frame)
  290.       static define sinsf
  291.      object {
  292.         smooth_height_fn 128, 128, -2, 2, -2, 2,
  293.                  0.25 * sin(18.85 * x * z + theta_offset)
  294.         shiny_red
  295.         }
  296.    ...
  297.    sinsf
  298.    ...
  299.  
  300. Two examples of how static variables can be used are found in the animation
  301. directory in the data file archive (PLYDAT.ZIP).  The first is "movsph.pi",
  302. which bounces several spherical blob components around inside a box.  The
  303. second is "cannon.pi" which points a cannon in several directions, firing
  304. balls once it is pointed.
  305.  
  306. Warning:  A texture inside a static object should ONLY be static itself.  The
  307. reason is that between frames, every non-static thing is deallocated.  If you
  308. have things inside a static object that point to a deallocated pointer, you
  309. will most certainly crash the program.  Sorry, but detecting these things would
  310. be too hard and reallocating all the memory would take up too much space.
  311.  
  312. XII) Color maps in special surfaces
  313.  
  314. In the interests of making layered textures a bit easier, if you use a color
  315. map in the "color" component of a special surface, then Polyray will check
  316. for an alpha value.  If one exists, then that value will be used for the
  317. "transmission" component of the surface.
  318.  
  319. As an example, the following functions and color maps are from the file
  320. "stones.inc", an adaptation of Mike Millers stones textures.  The base
  321. layer of the stone uses a color map that varies between a mauve and cream
  322. colors.  The top layer has some partially clear tan and rose.  
  323.  
  324. The first step is to define the solid texturing functions.  The functions
  325. granite_fn_xx are similar in effect to the POV-Ray granite plus turbulence.
  326. After that the color maps themselves are defined, followed by definitions
  327. of the coloring functions that use the granite functions to look up a color
  328. from the map.  The final step is to create a layered texture, "Stone3", that
  329. has Grnt0a on the top and Grnt5 below.
  330.  
  331.    define granite_fn_05 noise(8 * (P + 1.0 * dnoise(P, 1)), 5)
  332.    define granite_fn_06 noise(8 * (P + 1.2 * dnoise(P, 1)), 5)
  333.  
  334.    //------- Medium Mauve Med.Rose & deep cream
  335.    define Grnt5_map
  336.      color_map(
  337.         [0.000, 0.178, <0.804, 0.569, 0.494>, <0.855, 0.729, 0.584>]
  338.         [0.178, 0.356, <0.855, 0.729, 0.584>, <0.667, 0.502, 0.478>]
  339.         [0.356, 0.525, <0.667, 0.502, 0.478>, <0.859, 0.624, 0.545>]
  340.         [0.525, 0.729, <0.859, 0.624, 0.545>, <0.855, 0.729, 0.584>]
  341.         [0.729, 1.001, <0.855, 0.729, 0.584>, <0.804, 0.569, 0.494>])
  342.    
  343.    //--------- Gray Tan with Rose, partially transparent
  344.    define Grnt0a_map
  345.      color_map(
  346.         [0.000, 0.153, <0.729, 0.502, 0.451>, 0.306,
  347.                <0.769, 0.686, 0.592>, 0.792]
  348.         [0.153, 0.398, <0.769, 0.686, 0.592>, 0.792,
  349.                <0.843, 0.753, 0.718>, 0.396]
  350.         [0.398, 0.559, <0.843, 0.753, 0.718>, 0.396,
  351.                <0.780, 0.667, 0.561>, 0.976]
  352.         [0.559, 0.729, <0.780, 0.667, 0.561>, 0.976,
  353.                <0.741, 0.659, 0.576>, 0.820]
  354.         [0.729, 1.001, <0.741, 0.659, 0.576>, 0.820,
  355.                <0.729, 0.502, 0.451>, 0.306])
  356.  
  357.    define Grnt5 Grnt5_map[granite_fn_05]
  358.    define Grnt0a Grnt0a_map[granite_fn_06]
  359.  
  360.    //------------- Rose & Yellow Marble with fog white veining
  361.    define Stone3
  362.    texture {
  363.       layered
  364.      texture { special shiny { color Grnt0a }
  365.            scale <2, 3, 2> rotate <0, 0, -30> },
  366.      texture { special shiny { color Grnt5 }
  367.            scale <2, 3, 2> rotate <0, 0, 40> }
  368.       }
  369.  
  370.  
  371. A good way to build color maps for layered textures is with ColorMapper,
  372.        Written by : SoftTronics, Lutz + Kretzschmar
  373. This is available as CMAP.ZIP in the forum Graphdev on Compuserve.  This
  374. program allows you to build color maps with varying colors and transparency
  375. values.  The output of this program does have to be massaged a little bit to
  376. make it into a color map as Polyray understands it.  In order to help with
  377. this process an IBM executable, "makemap.exe" has been included.  To use this
  378. little program, you follow these steps:
  379.  
  380.    1) run CMAPPER to create a color map in the standard output (not the POV-Ray
  381.       output format).
  382.  
  383.    2) run makemap on that file, giving a name for the new Polyray color map
  384.       definition
  385.  
  386.    3) Add this definition to your Polyray data file.
  387.  
  388. If you saved your map as "foo.map", and you wanted to add this color map to
  389. the Polyray data file "foo.inc", with the name of foox_map, you would then
  390. run makemap the following way:
  391.  
  392.    makemap foo.map foox_map >> foo.inc
  393.  
  394. This makes the translation from CMAPPER format to Polyray format, and appends
  395. the output (as "define foox_map color_map(...)") to the file foo.inc.
  396.  
  397.  
  398. Have Fun and feel free to contact me if you have questions and/or comments.
  399. email is preferable, but I will eventually answer the ponderable kind.
  400.  
  401. Xander
  402.