back  Return to list

homeprevnext Name
homeprevnext Name Strings
homeprevnext Contact
    Mark J. Kilgard, NVIDIA Corporation (mjk 'at'  
homeprevnext Notice
    Copyright NVIDIA Corporation, 1999, 2000, 2001.  
homeprevnext IP Status
    NVIDIA Proprietary.  
homeprevnext Status
    Shipping (version 1.0)  
homeprevnext Version
    NVIDIA Date: January 18, 2001  
    $Date$ $Revision$  
    $Id: //sw/main/docs/OpenGL/specs/GL_NV_fog_distance.txt#14 $  
homeprevnext Number
homeprevnext Dependencies
    Written based on the wording of the OpenGL 1.2 specification.  
homeprevnext Overview
    Ideally, the fog distance (used to compute the fog factor as  
    described in Section 3.10) should be computed as the per-fragment  
    Euclidean distance to the fragment center from the eye.  In practice,  
    implementations "may choose to approximate the eye-coordinate  
    distance from the eye to each fragment center by abs(ze).  Further,  
    [the fog factor] f need not be computed at each fragment, but may  
    be computed at each vertex and interpolated as other data are."  
    This extension provides the application specific control over how  
    OpenGL computes the distance used in computing the fog factor.  
    The extension supports three fog distance modes: "eye plane absolute",  
    where the fog distance is the absolute planar distance from the eye  
    plane (i.e., OpenGL's standard implementation allowance as cited above);  
    "eye plane", where the fog distance is the signed planar distance  
    from the eye plane; and "eye radial", where the fog distance is  
    computed as a Euclidean distance.  In the case of the eye radial  
    fog distance mode, the distance may be computed per-vertex and then  
    interpolated per-fragment.  
    The intent of this extension is to provide applications with better  
    control over the tradeoff between performance and fog quality.  
    The "eye planar" modes (signed or absolute) are straightforward  
    to implement with good performance, but scenes are consistently  
    under-fogged at the edges of the field of view.  The "eye radial"  
    mode can provide for more accurate fog at the edges of the field of  
    view, but this assumes that either the eye radial fog distance is  
    computed per-fragment, or if the fog distance is computed per-vertex  
    and then interpolated per-fragment, then the scene must be  
    sufficiently tessellated.  
homeprevnext Issues
    What should the default state be?  
      The EYE_PLANE_ABSOLUTE_NV mode is the most consistent with the way  
      most current OpenGL implementations are implemented without this  
      extension, but because this extension provides specific control  
      over a capability that core OpenGL is intentionally lax about,  
      the default fog distance mode is left implementation dependent.  
      We would not want a future OpenGL implementation that supports  
      fast EYE_RADIAL_NV fog distance to be stuck using something less.  
      Advice:  If an implementation can provide fast per-pixel EYE_RADIAL_NV  
      support, then EYE_RADIAL_NV is the ideal default, but if not, then  
      EYE_PLANE_ABSOLUTE_NV is the most reasonable default mode.  
    How does this extension interact with the EXT_fog_coord extension?  
      then the fog distance mode is ignored.  However, the fog  
      distance mode is used when the FOG_COORDINATE_SOURCE_EXT is  
      set to FRAGMENT_DEPTH_EXT.  Essentially, when the EXT_fog_coord  
      functionality is enabled, the fog distance is supplied by the  
      user-supplied fog-coordinate so no automatic fog distance computation  
      is performed.  
homeprevnext New Procedures and Functions
homeprevnext New Tokens
    Accepted by the <pname> parameters of Fogf, Fogi, Fogfv, Fogiv,  
    GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev:  
        FOG_DISTANCE_MODE_NV               0x855A  
    When the <pname> parameter of Fogf, Fogi, Foggv, and Fogiv, is  
    FOG_DISTANCE_MODE_NV, then the value of <param> or the value pointed  
    to by <params> may be:  
        EYE_RADIAL_NV                      0x855B  
        EYE_PLANE_ABSOLUTE_NV              0x855C  
homeprevnext Additions to Chapter 2 of the 1.2 Specification (OpenGL Operation)
homeprevnext Additions to Chapter 3 of the 1.2 Specification (Rasterization)
 --  Section 3.10 "Fog"  
    Add to the end of the 3rd paragraph:  
    "If pname is FOG_DISTANCE_MODE_NV, then param must be, or params  
    must point to an integer that is one of the symbolic constants  
    EYE_PLANE_ABSOLUTE_NV, EYE_PLANE, or EYE_RADIAL_NV and this symbolic  
    constant determines how the fog distance should be computed."  
    Replace the 4th paragraph beginning "An implementation may choose  
    to approximate ..." with:  
    "When the fog distance mode is EYE_PLANE_ABSOLUTE_NV, the fog  
    distance z is approximated by abs(ze) [where ze is the Z component  
    of the fragment's eye position].  When the fog distance mode is  
    EYE_PLANE, the fog distance z is approximated by ze.  When the  
    fog distance mode is EYE_RADIAL_NV, the fog distance z is computed  
    as the Euclidean distance from the center of the fragment in eye  
    coordinates to the eye position.  Specifically:  
      z  =  sqrt( xe*xe + ye*ye + ze*ze );  
    In the EYE_RADIAL_NV fog distance mode, the Euclidean distance  
    is permitted to be computed per-vertex, and then interpolated  
    Change the last paragraph to read:  
    "The state required for fog consists of a three valued integer to  
    select the fog equation, a three valued integer to select the fog  
    distance mode, three floating-point values d, e, and s, and RGBA fog  
    color and a fog color index, and a single bit to indicate whether  
    or not fog is enabled.  In the initial state, fog is disabled,  
    FOG_MODE is EXP, FOG_DISTANCE_NV is implementation defined, d =  
    1.0, e = 1.0, and s = 0.0; Cf = (0,0,0,0) and if = 0."   
homeprevnext Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations and the Frame Buffer)
homeprevnext Additions to Chapter 5 of the 1.2 Specification (Special Functions)
homeprevnext Additions to Chapter 6 of the 1.2 Specification (State and State Requests)
homeprevnext Additions to the AGL/GLX/WGL Specifications
homeprevnext GLX Protocol
homeprevnext Errors
    INVALID_ENUM is generated when Fog is called with a <pname> of  
    FOG_DISTANCE_MODE_NV and the value of <param> or what is pointed  
    to by <params> is not one of EYE_PLANE_ABSOLUTE_NV, EYE_PLANE,  
    or EYE_RADIAL_NV.  
homeprevnext New State
(table 6.8, p198) add the entry:  
Get Value              Type    Get Command  Initial Value      Description      Sec     Attribute  
--------------------   ----    -----------  ---------------    -----------      -----   ---------  
FOG_DISTANCE_MODE_NV   Z3      GetIntegerv  implementation     Determines how   3.10    fog  
                                            dependent          fog distance        
                                                               is computed  
New Implementation State  
homeprevnext Revision History
Valid XHTML 1.1! Valid CSS! Last update: November 14, 2006.
Cette page doit être lue avec un navigateur récent respectant le standard XHTML 1.1.