XXX - Not complete yet!!!
Name

    SGIX_fog_layers

Name Strings

    GL_SGIX_fog_layers

Version

    $Date: 1999/03/30 23:13:43 $ $Revision: 1.14 $

Number

    ??

Dependencies

    OpenGL 1.2 is required

Overview

    This extension adds support for layered fog. The layers are
    specified using a density profile of the fog with respect to the
    elevation using "control" points to represent (elevation, density)
    tuples. The density is assumed to vary linearly between successive
    control point elevations. The maximum number of such points is
    implementation dependent.


New Procedures and Functions

    void FogLayersSGIX(sizei n, const float *points);

    void GetFogLayersSGIX(float *points);

Issues

    * Should the API present the abstraction of layers to the user ? Or
      is this density profile specification good enough ? The problem
      with abstracting layers is to guarantee consistency of densities
      and elevations when each layer can be manipulated independently of
      others!

New Tokens

    Accepted by the <pname> parameter of Fogf, Fogi, Fogiv, Fogfv,
    GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv:

	FOG_TYPE_SGIX			0x8323

    Accepted by the <param> parameter of Fogf and Fogi, and by the
    <params> parameter of Fogiv and Fogfv, when their <pname>
    parameter is FOG_TYPE_SGIX:

	UNIFORM_SGIX			0x8324
	LAYERED_SGIX			0x8325

    Accepted by the <pname> parameter of Fogfv, Fogiv, GetBooleanv,
    GetDoublev, GetIntegerv, and GetFloatv:

	FOG_GROUND_PLANE_SGIX		0x8326

    Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
    GetIntegerv, and GetFloatv:

	FOG_LAYERS_POINTS_SGIX		0x8327
	MAX_FOG_LAYERS_POINTS_SGIX	0x8328

Additions to Chapter 2 of the 1.2 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

    3.10 Fog

    In addition to uniform fog density, fog layers can be specified.
    The implementation  technique that is used to interpolate the
    density between successive fog layers is implementation dependent.
    The density profile of the fog with respect to elevation is
    specified by calling FogLayersSGIX with <points>
    pointing at an array of pairs of floating point values, and <n> set
    to the number of value pairs in <points>.  The first value of each
    value pair in <points> specifies the elevation (should not be
    negative), and the second value specifies the fog density at that
    elevation. The fog density values are clamped to the range [0.0,
    1.0]. The elevations in the specification of the density profile
    must  be monotonically increasing. At least one point must be
    specified. The first point in the distribution must have an 
    elevation of zero. The maximum number of points is implementation
    dependent and may be enquired using Get commands. The initial
    state of the fog layer specification is defined by the single 
    point (0.0, 0.0). The fog density above the maximum user-specified
    elevation is the density value in the last point in the profile.
    Layered fog computations are defined only for positive elevations;
    negative elevations result in switching back to uniform range fog model.

    The elevation of any eye-space point A = (x, y, z, w) is defined
    as the distance from the ground plane specified using glFog and
    FOG_GROUND_PLANE_SGIX. Let the ground plane be defined by a
    four-component plane equation in object-coordinates

	G = (a, b, c, d).

	where a, b, c and d are specified in order in the <params>
    argument for Fogfv or Fogiv.

    The ground plane is transformed into eye-coordinate space usi
    the inverse transpose of the model-view matrix. Then the elevation 
    of point A (in eye-coordinate space) is the dot product A . G'
    (G' - ground plane in eye-coordinate space):

	elevation = a*x + b*y + c*z + d*w

    Since the eye-point is defined to be at (0,0,0,1) in camera-space,
    the elevation of the eye-point is the same as 'd' (the fourth
    component of the ground plane).


		    ___________
		    |         |	 S  |\
	elevation --| Layered |-----| \	      _____
		    |   Fog   |	    |  \     | 	   |	   To fog equation
		    |_________|	    |  |_____|  *  |-------
	    	 		    |  |   __|     |	   (r*S)
	    	 		    |  /  |  |_____|
    		 uniform density ---| /	  |
		        	    |/	  |
		        		  |
		   range   _______________|



    The effective density 'S' from the eye-point is computed for every
    fragment using the fog layer specification (XXX: how?). This
    density is used in the fog equation to compute the fog blending
    factor 'f' depending on the selected FOG_MODE.


Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations
and the Frame Buffer)

    None

Additions to Chapter 5 of the 1.2 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.2 Specification (State and State Requests)

    The max allowed number of points in the fog layer specification
    is queried by calling GetBooleanv, GetIntegerv, GetFloatv, and
    GetDoublev with <pname> set to MAX_FOG_LAYERS_POINTS_SGIX. The
    number of points in the current fog layers specification is queried
    by calling GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev with
    <pname> set to FOG_LAYERS_POINTS_SGIX.  All the points of the
    current fog layer specification are queried by calling
    GetFogLayersSGIX. Points are returned in the same format as they
    are specified in the FogLayersSGIX function.

Additions to the GLX Specification

    None

Errors

    INVALID_VALUE is generated if FogLayersSGIX parameter <n> is
    less than 1.

    INVALID_VALUE is generated if any elevation is less than zero.

    INVALID_OPERATION is generated if FogLayersSGIX is executed
    between execution of Begin and the corresponding execution to
    End. 

    INVALID_OPERATION is generated if GetFogLayersSGIX is executed
    between execution of Begin and the corresponding execution to
    End. 

New State

    Get Value			Get Command		Type		Initial Value	Attribute
    ---------			-----------		----		-------------	---------
    MAX_FOG_LAYERS_POINTS_SGIX	GetIntegerv		Z+		XXX
    FOG_LAYERS_POINTS_SGIX	GetIntegerv		Z+		1		fog
    FOG_GROUND_PLANE_SGIX	GetFloatv		V		(0,0,0,0)	fog
    FOG_TYPE_SGIX		GetIntegerv		Z+		UNIFORM_SGIX    fog


New Implementation Dependent State

    None
