| Name | 
 |  | 
 |     EXT_fog_coord | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_EXT_fog_coord | 
 |  | 
 | Contact | 
 |  | 
 |     Jon Leech, Silicon Graphics (ljp 'at' sgi.com) | 
 |  | 
 | Status | 
 |  | 
 |     Shipping (version 1.6) | 
 |  | 
 | Version | 
 |  | 
 |     $Date: 1999/06/21 19:57:19 $ $Revision: 1.11 $ | 
 |  | 
 | Number | 
 |  | 
 |     149 | 
 |  | 
 | Dependencies | 
 |  | 
 |     OpenGL 1.1 is required. | 
 |     The extension is written against the OpenGL 1.2 Specification. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension allows specifying an explicit per-vertex fog | 
 |     coordinate to be used in fog computations, rather than using a | 
 |     fragment depth-based fog equation. | 
 |  | 
 | Issues | 
 |  | 
 |   * Should the specified value be used directly as the fog weighting | 
 |     factor, or in place of the z input to the fog equations? | 
 |  | 
 |         As the z input; more flexible and meets ISV requests. | 
 |  | 
 |   * Do we want vertex array entry points? Interleaved array formats? | 
 |  | 
 |         Yes for entry points, no for interleaved formats, following the | 
 |         argument for secondary_color. | 
 |  | 
 |   * Which scalar types should FogCoord accept? The full range, or just | 
 |     the unsigned and float versions? At the moment it follows Index(), | 
 |     which takes unsigned byte, signed short, signed int, float, and | 
 |     double. | 
 |  | 
 |         Since we're now specifying a number which behaves like an | 
 |         eye-space distance, rather than a [0,1] quantity, integer types | 
 |         are less useful. However, restricting the commands to floating | 
 |         point forms only introduces some nonorthogonality. | 
 |  | 
 |         Restrict to only float and double, for now. | 
 |  | 
 |   * Interpolation of the fog coordinate may be perspective-correct or | 
 |     not. Should this be affected by PERSPECTIVE_CORRECTION_HINT, | 
 |     FOG_HINT, or another to-be-defined hint? | 
 |  | 
 |         PERSPECTIVE_CORRECTION_HINT; this is already defined to affect | 
 |         all interpolated parameters. Admittedly this is a loss of | 
 |         orthogonality. | 
 |  | 
 |   * Should the current fog coordinate be queryable? | 
 |  | 
 |         Yes, but it's not returned by feedback. | 
 |  | 
 |   * Control the fog coordinate source via an Enable instead of a fog | 
 |     parameter? | 
 |  | 
 |         No. We might want to add more sources later. | 
 |  | 
 |   * Should the fog coordinate be restricted to non-negative values? | 
 |  | 
 |         Perhaps. Eye-coordinate distance of fragments will be | 
 |         non-negative due to clipping. Specifying explicit negative | 
 |         coordinates may result in very large computed f values, although | 
 |         they are defined to be clipped after computation. | 
 |  | 
 |   * Use existing DEPTH enum instead of FRAGMENT_DEPTH? Change name of | 
 |     FRAGMENT_DEPTH_EXT to FOG_FRAGMENT_DEPTH_EXT? | 
 |  | 
 |         Use FRAGMENT_DEPTH_EXT; FOG_FRAGMENT_DEPTH_EXT is somewhat | 
 |         misleading, since fragment depth itself has no dependence on | 
 |         fog. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     void FogCoord[fd]EXT(T coord) | 
 |     void FogCoord[fd]vEXT(T coord) | 
 |     void FogCoordPointerEXT(enum type, sizei stride, void *pointer) | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <pname> parameter of Fogi and Fogf: | 
 |  | 
 |         FOG_COORDINATE_SOURCE_EXT           0x8450 | 
 |  | 
 |     Accepted by the <param> parameter of Fogi and Fogf: | 
 |  | 
 |         FOG_COORDINATE_EXT                  0x8451 | 
 |         FRAGMENT_DEPTH_EXT                  0x8452 | 
 |  | 
 |     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, | 
 |     GetFloatv, and GetDoublev: | 
 |  | 
 |         CURRENT_FOG_COORDINATE_EXT          0x8453 | 
 |         FOG_COORDINATE_ARRAY_TYPE_EXT       0x8454 | 
 |         FOG_COORDINATE_ARRAY_STRIDE_EXT     0x8455 | 
 |  | 
 |     Accepted by the <pname> parameter of GetPointerv: | 
 |  | 
 |         FOG_COORDINATE_ARRAY_POINTER_EXT    0x8456 | 
 |  | 
 |     Accepted by the <array> parameter of EnableClientState and | 
 |     DisableClientState: | 
 |  | 
 |         FOG_COORDINATE_ARRAY_EXT            0x8457 | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 1.2 Specification (OpenGL Operation) | 
 |  | 
 |   These changes describe a new current state type, the fog coordinate, | 
 |   and the commands to specify it: | 
 |  | 
 |   - (2.6, p. 12) Second paragraph changed to: | 
 |  | 
 |         "Each vertex is specified with two, three, or four coordinates. | 
 |         In addition, a current normal, current texture coordinates, | 
 |         current color, and current fog coordinate may be used in | 
 |         processing each vertex." | 
 |  | 
 |   - 2.6.3, p. 19) First paragraph changed to | 
 |  | 
 |         "The only GL commands that are allowed within any Begin/End | 
 |         pairs are the commands for specifying vertex coordinates, vertex | 
 |         colors, normal coordinates, texture coordinates, and fog | 
 |         coordinates (Vertex, Color, Index, Normal, TexCoord, | 
 |         FogCoord)..." | 
 |  | 
 |   - (2.7, p. 20) Insert the following paragraph following the third | 
 |         paragraph describing current normals: | 
 |  | 
 |         "   The current fog coodinate is set using | 
 |                 void FogCoord[fd]EXT(T coord) | 
 |                 void FogCoord[fd]vEXT(T coord)." | 
 |  | 
 |     The last paragraph is changed to read: | 
 |  | 
 |         "The state required to support vertex specification consists of | 
 |         four floating-point numbers to store the current texture | 
 |         coordinates s, t, r, and q, one floating-point value to store | 
 |         the current fog coordinate, four floating-point values to store | 
 |         the current RGBA color, and one floating-point value to store | 
 |         the current color index. There is no notion of a current vertex, | 
 |         so no state is devoted to vertex coordinates. The initial values | 
 |         of s, t, and r of the current texture coordinates are zero; the | 
 |         initial value of q is one. The initial fog coordinate is zero. | 
 |         The initial current normal has coordinates (0,0,1). The initial | 
 |         RGBA color is (R,G,B,A) = (1,1,1,1). The initial color index is | 
 |         1." | 
 |  | 
 |   - (2.8, p. 21) Added fog coordinate command for vertex arrays: | 
 |  | 
 |     Change first paragraph to read: | 
 |  | 
 |         "The vertex specification commands described in section 2.7 | 
 |         accept data in almost any format, but their use requires many | 
 |         command executions to specify even simple geometry. Vertex data | 
 |         may also be placed into arrays that are stored in the client's | 
 |         address space. Blocks of data in these arrays may then be used | 
 |         to specify multiple geometric primitives through the execution | 
 |         of a single GL command. The client may specify up to seven | 
 |         arrays: one each to store edge flags, texture coordinates, fog | 
 |         coordinates, colors, color indices, normals, and vertices. The | 
 |         commands" | 
 |  | 
 |     Add to functions listed following first paragraph: | 
 |  | 
 |         void FogCoordPointerEXT(enum type, sizei stride, void *pointer) | 
 |  | 
 |     Add to table 2.4 (p. 22): | 
 |  | 
 |         Command                     Sizes   Types | 
 |         -------                     -----   ----- | 
 |         FogCoordPointerEXT          1       float,double | 
 |  | 
 |     Starting with the second paragraph on p. 23, change to add | 
 |     FOG_COORDINATE_ARRAY_EXT: | 
 |  | 
 |         "An individual array is enabled or disabled by calling one of | 
 |  | 
 |             void EnableClientState(enum array) | 
 |             void DisableClientState(enum array) | 
 |  | 
 |         with array set to EDGE_FLAG_ARRAY, TEXTURE_COORD_ARRAY, | 
 |         FOG_COORDINATE_ARRAY_EXT, COLOR_ARRAY, INDEX_ARRAY, | 
 |         NORMAL_ARRAY, or VERTEX_ARRAY, for the edge flag, texture | 
 |         coordinate, fog coordinate, color, color index, normal, or | 
 |         vertex array, respectively. | 
 |  | 
 |         The ith element of every enabled array is transferred to the GL | 
 |         by calling | 
 |  | 
 |             void ArrayElement(int i) | 
 |  | 
 |         For each enabled array, it is as though the corresponding | 
 |         command from section 2.7 or section 2.6.2 were called with a | 
 |         pointer to element i. For the vertex array, the corresponding | 
 |         command is Vertex<size><type>v, where <size> is one of [2,3,4], | 
 |         and <type> is one of [s,i,f,d], corresponding to array types | 
 |         short, int, float, and double respectively. The corresponding | 
 |         commands for the edge flag, texture coordinate, fog coordinate, | 
 |         color, color, color index, and normal arrays are EdgeFlagv, | 
 |         TexCoord<size><type>v, FogCoord<type>v, Color<size><type>v, | 
 |         Index<type>v, and Normal<type>v, respectively..." | 
 |  | 
 |     Change pseudocode on p. 27 to disable fog coordinate array for | 
 |     canned interleaved array formats. After the lines | 
 |  | 
 |             DisableClientState(EDGE_FLAG_ARRAY); | 
 |             DisableClientState(INDEX_ARRAY); | 
 |  | 
 |         insert the line | 
 |  | 
 |             DisableClientState(FOG_COORDINATE_ARRAY_EXT); | 
 |  | 
 |     Substitute "seven" for every occurence of "six" in the final | 
 |     paragraph on p. 27. | 
 |  | 
 |   - (2.12, p. 41) Add fog coordinate to the current rasterpos state. | 
 |  | 
 |     Change the first sentence of the first paragraph to read | 
 |  | 
 |         "The state required for the current raster position consists of | 
 |         three window coordinates x_w, y_w, and z_w, a clip coordinate | 
 |         w_c value, an eye coordinate distance, a fog coordinate, a valid | 
 |         bit, and associated data consisting of a color and texture | 
 |         coordinates." | 
 |  | 
 |     Change the last paragraph to read | 
 |  | 
 |         "The current raster position requires six single-precision | 
 |         floating-point values for its x_w, y_w, and z_w window | 
 |         coordinates, its w_c clip coordinate, its eye coordinate | 
 |         distance, and its fog coordinate, a single valid bit, a color | 
 |         (RGBA color and color index), and texture coordinates for | 
 |         associated data. In the initial state, the coordinates and | 
 |         texture coordinates are both (0,0,0,1), the fog coordinate is 0, | 
 |         the eye coordinate distance is 0, the valid bit is set, the | 
 |         associated RGBA color is (1,1,1,1), and the associated color | 
 |         index color is 1. In RGBA mode, the associated color index | 
 |         always has its initial value; in color index mode, the RGBA | 
 |         color always maintains its initial value." | 
 |  | 
 |   - (3.10, p. 139) Change the second and third paragraphs to read | 
 |  | 
 |         "This factor f may be computed according to one of three | 
 |         equations:" | 
 |  | 
 |             f = exp(-d*c)       (3.24) | 
 |             f = exp(-(d*c)^2)   (3.25) | 
 |             f = (e-c)/(e-s)     (3.26) | 
 |  | 
 |         If the fog source (as defined below) is FRAGMENT_DEPTH_EXT, then | 
 |         c is the eye-coordinate distance from the eye, (0 0 0 1) in eye | 
 |         coordinates, to the fragment center. If the fog source is | 
 |         FOG_COORDINATE_EXT, then c is the interpolated value of the fog | 
 |         coordinate for this fragment. The equation and the fog source, | 
 |         along with either d or e and s, is specified with | 
 |  | 
 |             void Fog{if}(enum pname, T param); | 
 |             void Fog{if}v(enum pname, T params); | 
 |  | 
 |         If <pname> is FOG_MODE, then <param> must be, or <param> must | 
 |         point to an integer that is one of the symbolic constants EXP, | 
 |         EXP2, or LINEAR, in which case equation 3.24, 3.25, or 3.26,, | 
 |         respectively, is selected for the fog calculation (if, when 3.26 | 
 |         is selected, e = s, results are undefined). If <pname> is | 
 |         FOG_COORDINATE_SOURCE_EXT, then <param> is or <params> points to | 
 |         an integer that is one of the symbolic constants | 
 |         FRAGMENT_DEPTH_EXT or FOG_COORDINATE_EXT. If <pname> is | 
 |         FOG_DENSITY, FOG_START, or FOG_END, then <param> is or <params> | 
 |         points to a value that is d, s, or e, respectively. If d is | 
 |         specified less than zero, the error INVALID_VALUE results." | 
 |  | 
 |   - (3.10, p. 140) Change the last paragraph preceding section 3.11 | 
 |     to read | 
 |  | 
 |         "The state required for fog consists of a three valued integer | 
 |         to select the fog equation, three floating-point values d, e, | 
 |         and s, an RGBA fog color and a fog color index, a two-valued | 
 |         integer to select the fog coordinate source, and a single bit to | 
 |         indicate whether or not fog is enabled. In the initial state, | 
 |         fog is disabled, FOG_COORDINATE_SOURCE_EXT is | 
 |         FRAGMENT_DEPTH_EXT, FOG_MODE is EXP, d = 1.0, e = 1.0, and s = | 
 |         0.0; C_f = (0,0,0,0) and i_f=0." | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment | 
 | Operations and the Frame Buffer) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 6 of the OpenGL 1.2 Specification (State and State | 
 | Requests) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance) | 
 |  | 
 |     None | 
 |  | 
 | Additions to the GLX / WGL / AGL Specifications | 
 |  | 
 |     None | 
 |  | 
 | GLX Protocol | 
 |  | 
 |     Two new GL rendering commands are added. The following commands are | 
 |     sent to the server as part of a glXRender request: | 
 |  | 
 |         FogCoordfvEXT | 
 |             2           8               rendering command length | 
 |             2           4124            rendering command opcode | 
 |             4           FLOAT32         v[0] | 
 |  | 
 |         FogCoorddvEXT | 
 |             2           12              rendering command length | 
 |             2           4125            rendering command opcode | 
 |             8           FLOAT64         v[0] | 
 |  | 
 | Errors | 
 |  | 
 |     INVALID_ENUM is generated if FogCoordPointerEXT parameter <type> is | 
 |     not FLOAT or DOUBLE. | 
 |  | 
 |     INVALID_VALUE is generated if FogCoordPointerEXT parameter <stride> | 
 |     is negative. | 
 |  | 
 | New State | 
 |  | 
 | (table 6.5, p. 195) | 
 |     Get Value                   Type    Get Command     Initial Value   Description     Sec Attribute | 
 |     ---------                   ----    -----------     -------------   -----------     --- --------- | 
 |     CURRENT_FOG_COORDINATE_EXT  R       GetIntegerv,    0               Current         2.7 current | 
 |                                         GetFloatv                       fog coordinate | 
 |  | 
 | (table 6.6, p. 197) | 
 |     Get Value                           Type    Get Command     Initial Value   Description                     Sec Attribute | 
 |     ---------                           ----    -----------     -------------   -----------                     --- --------- | 
 |     FOG_COORDINATE_ARRAY_EXT            B       IsEnabled       False           Fog coord array enable          2.8 vertex-array | 
 |     FOG_COORDINATE_ARRAY_TYPE_EXT       Z8      GetIntegerv     FLOAT           Type of fog coordinate          2.8 vertex-array | 
 |     FOG_COORDINATE_ARRAY_STRIDE_EXT     Z+      GetIntegerv     0               Stride between fog coords       2.8 vertex-array | 
 |     FOG_COORDINATE_ARRAY_POINTER_EXT    Y       GetPointerv     0               Pointer to the fog coord array  2.8 vertex-array | 
 |  | 
 |  | 
 | (table 6.8, p. 198) | 
 |     Get Value                   Type    Get Command     Initial Value       Description     Sec     Attribute | 
 |     ---------                   ----    -----------     -------------       -----------     ---     --------- | 
 |     FOG_COORDINATE_SOURCE_EXT   Z2      GetIntegerv,    FRAGMENT_DEPTH_EXT  Source of fog   3.10    fog | 
 |                                         GetFloatv                           coordinate for | 
 |                                                                             fog calculation | 
 |  | 
 | Revision History | 
 |  | 
 |   * Revision 1.6 - Functionality complete | 
 |  | 
 |   * Revision 1.7-1.9 - Fix typos and add fields to bring up to date with | 
 |     the new extension template. No functionality changes. |