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 parameter of Fogf, Fogi, Fogiv, Fogfv,
GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv:
FOG_TYPE_SGIX 0x8323
Accepted by the parameter of Fogf and Fogi, and by the
parameter of Fogiv and Fogfv, when their
parameter is FOG_TYPE_SGIX:
UNIFORM_SGIX 0x8324
LAYERED_SGIX 0x8325
Accepted by the parameter of Fogfv, Fogiv, GetBooleanv,
GetDoublev, GetIntegerv, and GetFloatv:
FOG_GROUND_PLANE_SGIX 0x8326
Accepted by the 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
pointing at an array of pairs of floating point values, and set
to the number of value pairs in . The first value of each
value pair in 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 userspecified
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 eyespace 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
fourcomponent plane equation in objectcoordinates
G = (a, b, c, d).
where a, b, c and d are specified in order in the
argument for Fogfv or Fogiv.
The ground plane is transformed into eyecoordinate space usi
the inverse transpose of the modelview matrix. Then the elevation
of point A (in eyecoordinate space) is the dot product A . G'
(G'  ground plane in eyecoordinate space):
elevation = a*x + b*y + c*z + d*w
Since the eyepoint is defined to be at (0,0,0,1) in cameraspace,
the elevation of the eyepoint 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 eyepoint 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 (PerFragment 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 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
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 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