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