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 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 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 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